stack & heap

0
  1. Czy jest jakaś mozliwość dynamicznie zaalokować tablicę na stosie zamiast stercie?

  2. Czy jeżeli mam klase class klasa { int x = 42; }; klasa kl; to zmienna x bedzie trzymana na stosie tak samo jak objekt tej klasy? Co jeśli wrzucę to do std::vector który umiesci to na stercie? Czy wtedy wszystko razem z int x bedzie znajdowało się na stercie poza samym vectorem?

  3. Co jeśli trzymam w std::vector klasę która posiada własny, ale mały, trzymający małe wartosci std::vector? Jego zawartosc pójdzie na heap mimo ze jest bardzo często używany. Czy to pogorszy wydajność mojego programu?

0

W C99 masz VLA, w C++ nie. Na pewno jest Ci to potrzebne, nie za wcześnie na optymalizacje? ;)

0

Dlaczego sam tego nie sprawdzisz? Masz tu po kolei głupoty i głupoty

1
  1. W C++ nie.
  2. Jeśli zrobisz obiekt na stosie, no to wszystkie jego składniki będą na stosie. Czyli jeśli klasa wygląda tak:
class klasa { public: uint32_t m_member; }; 

no to po utworzeniu obiektu owej klasy m_member będzie na stosie. I w zasadzie tylko to będzie na stosie, bo klasa w tym przypadku ma 4 bajty. W przypadku kiedy mamy metody wirtualne dochodzi jeszcze vtabela która jest unsigned intem więc obiekt na stosie by zajmował 8 bajtów.
Ale jeśli będziesz miał obiekt w obiekcie, np.

class klasa { public: uint32_t m_member; std::vector<int> m_array; };

No to zmienne które masz w std::vector<int> zostaną wprost "przekopiowane" do twojej klasy. Czyli jeśli w std::vector<int> jest dajmy na to tylko uint32_t no to on zostanie wstawiony zamiast m_array. I wtedy w tym przypadku będziesz miał 8 bajtów na stosie. I tak samo.. jeśli std::vector ma wirtualne metody to też dochodzi vtabela, która też ląduje w twojej klasie i wtedy ona już zajmuje 12 bajtów. W std::vector jest po prostu najpewniej wskaźnik do danych, wielkość owych danych, vtabela, i pewnie jeszcze sporo innych rzeczy, ale jeśli przyjmiemy tylko te 3 elementy to twoja klasa będzie miała 16 bajtów (4 bajty m_member, i 12 bajtów std::vector<int>). A więc to std::vector decyduje o tym gdzie zostaną umieszczone dane. Czy na stosie (statyczna ilość elementów w arrayu), czy na stercie (wskaźnik i alokacja).

  1. Jak mówię, to zależy od samej klasy.
0
  1. W C++ nie.

Niezupełnie. W C++ dynamiczna alokacja na stosie jest możliwa przez alloca(), jednak nie jest to rozwiązanie w pełni przenośne. Dodatkowo zinlinowanie funkcji używającej alloca może prowadzić do stack overflow: http://stackoverflow.com/questions/1018853/why-is-alloca-not-considered-good-practice

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