Tablice w C++ czy tak wolno?

0

Czy tak wolno oO?
http://ideone.com/Js0o7
Myślałem, że takie bajery jedynie za pomocą malloc mozna robic?

0

Sorki za spam..
http://ideone.com/CZP2D
C++0x i już błąd.. to ocb?

0

nie powinno się używać takich zapisów bo tablica taka ląduje na stosie, a na stosie elementy powinny mieć stałą i znaną w czasie kompilacji długość.
część kompilatorów pozwala na taki zapis, ale nie jest on poprawny i nie mam pojęcia co się dzieje przy użyciu go.

0

W C99 to się nazywa VLA (Variable Length Arrays) i nawet można takie tablice umieszczać w strukturach, natomiast jest to także niestandardowe rozszerzenie GCC dla C++.

0

tak można w C99 tworzyć tablice, w C++ to nie powinno mieć miejsca..

0

No ale jak widać w starym GCC (ideone) działa a w nowym standardzie (C++0x) już nie :)

0

Opcja -std=c++0x wymusza zgodność ze standardem, a VLA w C++ nie istnieją. Gdyby na ideone dali -std=gnu++0x to pewnie by działało.

Edit:
O, jednak nie. Tylko warning jest, jeżeli da się -pedantic, czyli działa. Trochę bez sensu.

0

No faktycznie działa.
Ale to nie znaczy, ze tak powinno się robić prawda?
Bo nie powinno się? I w ogole jest to praktyczne?

1

najpraktyczniej jest użyć vector<int> tablica(rozmiar); [na początku kodu: #include <vector> i potem using namespace std;] zamiast takich kombinacji

1

VLA jest głównie nie wspierane przez VS, więc odpada Ci jeden z lepszych kompilatorów na bardzo popularną platformę. Pomijając kwestię zapisu, to można używać alloca (sic), która o ile dobrze pamiętam jest wspierana przez prawie wszystkie kompilatory. Zaletą takiego rozwiązania może być większa szybkość alokowania/zwalniania pamięci niż malloc. Problem pojawia się z możliwością wyczerpania się miejsca na stosie, co może spowodować nieprzewidywalne błędy. Niekiedy mogą być one też spowodowane przez optymalizację kompilatora (inline i rozwijanie funkcji, gcc na szczęście tego w tym wypadku nie robi).

Ogólnie nie radzą stosować tego rozwiązania gdy ilość alokowanej pamięci przekracza około 1kB, zysk na szybkości jest pomijalny, a ryzyko SO ogromne. W innych wypadkach użyłbym VLA/alloca tylko gdy zysk na tej optymalizacji jest zauważalny (tyczy się to oczywiście każdych optymalizacji). Używanie tego tylko, żeby pisać mniej, może mieć miejsca wyłącznie na konkursach algorytmicznych.

0

Ale to nie znaczy, ze tak powinno się robić prawda?
To zależy, czy chcesz się trzymać standardu, czy pozwalasz sobie na użycie składni obsługiwanej przez konkretny kompilator.

Bo nie powinno się?
Jak wyżej. To działa prawidłowo i nie wybuchnie.

nie mam pojęcia co się dzieje przy użyciu go
Dokładnie to co się wydaje: powstaje tablica na stosie o rozmiarze takim, jaka w danym momencie jest wartość zmiennej podanej jako rozmiar. Późniejsza zmiana wartości tej zmiennej nie zmieni raz ustawionego rozmiaru tablicy.

I w ogole jest to praktyczne?
Tak, używam tego w średnio-dużym projekcie. Ale napisanym w C, więc jestem rozgrzeszony..

zysk na szybkości jest pomijalny
z drugiej strony, nie trzeba pamiętać o ręcznym zwalnianiu takiej tablicy.

BTW. nie tylko gcc, bo clang też pozwala na VLA w C++.

0

Azerien, racja

#include <iostream>
using namespace std;

int main()
{
    int rozmiar;
    cout << "Podaj wielkosc tablicy: ";
    cin >> rozmiar;
    int tablica[rozmiar];
    int tu_przekopiuje[rozmiar];

    //wypelnienie tablic
    for(int i = 0; i < rozmiar; i++)
    {
         tablica[i] = i;
         tu_przekopiuje[i] = i;
    }


    //dodawania elementow
    for(int i = 0; i < rozmiar; i++)
    {
        tablica[i]+=tu_przekopiuje[i];
        cout << tablica[i] << endl;
    }
    rozmiar = 50;
     for(int i = 0; i < rozmiar; i++)
    {
         tablica[i] = i;
         tu_przekopiuje[i] = i;
    }


    //dodawania elementow
    for(int i = 0; i < rozmiar; i++)
    {
        tablica[i]+=tu_przekopiuje[i];
        cout << tablica[i] << endl;
    }
}
 

program sie wysypie

0
Drey napisał(a)
    cout << "Podaj wielkosc tablicy: ";
    cin >> rozmiar;
    int tablica[rozmiar];

theh, ten też:

#include <cstdio>
using namespace std;
int main()
{
    printf("wysypać program (t/n)?");
    if(getchar() == 't')
    {
        int*p = 0;
        *p = 0xDEADBEEF;
    }
}
0
int bleble[rozmiar];
...
rozmiar = 50;
...

Co to niby miało znaczyć? Przecież tablice bleble ma tutaj taki rozmiar jaka była zawartość zmiennej rozmiar w momencie stworzenia, manipulowanie zmienną rozmiar po utworzeniu tablicy nic nie daje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1