Как определить, должен ли объект быть на стеке или нет?

Потому что вы хотите использовать условный (производный) столбец (все условия) вместо выбора самого столбца. В соответствии с синтаксисом SQL все столбцы (как они есть, так и производные) должны быть частью синтаксиса выбора.

7
задан 5gon12eder 6 March 2016 в 23:04
поделиться

6 ответов

Хорошо во-первых векторы (и все контейнерные классы STL) всегда выделяют от "кучи", таким образом, Вы не должны волноваться об этом. Для любого контейнера с переменным размером в значительной степени невозможно использовать стек.

Если Вы думаете о том, как выделение стека работает (во время компиляции, в основном путем постепенного увеличения указателя для каждого объекта) затем, должно быть ясно, что векторная память прибывает из "кучи".

std::vector<int> myInts;
std::string myString;
SomeOther Class;

// this memory must come from the heap, there's no way it
// can now be allocated on the stack since there are other
// objects and these parameters could be variable
myString = "Some String";
myInts.reserve(256);

Если Вы не находитесь в рекурсивной функции, можно поместить несколько килобайтов данных по стеку без большого количества беспокойства. Размерами стека управляет программа (не ОС), и значение по умолчанию имеет тенденцию колебаться от 32 КБ - 1 МБ. Большая часть программного обеспечения, установленного на компьютере входит в диапазоне 1 МБ.

Отдельные объекты почти никогда не являются беспокойством. В целом они или будут достаточно маленькими для стека или выделят внутренне от "кучи".

Если объекты локальны для функции, помещает их на стек. Если не помещенный их на "кучу".

Используйте "кучу" для больших буферов, которые Вы выделяете для данных загрузки/сортировки/управления.

10
ответ дан 6 December 2019 в 09:22
поделиться

Согласно значениям по умолчанию размера стека MSDN к 1 МБ. (Это для Msdev, очевидно).

Как Вы видите от статьи, можно изменить размер стека во время компиляции с флагом/F.

Я думаю, что Ваша первая инструкция для стека по сравнению с использованием "кучи" довольно точна с квалификацией, что, если Вы временная переменная объема являетесь более крупными, чем МБ, прикрепите ее на "кучу" (и вероятно спросите, почему Вы выделяете такую память в течение короткого промежутка времени во-первых).

4
ответ дан 6 December 2019 в 09:22
поделиться

Единственным путем можно выделить большие объекты на стеке, должен был включить массив старого стиля в какой-то момент. Например:

void f() {
   char a[1000000];    // big object on the stack
}

struct A {
   char c[1000000];
};

void g() {
   A a;      // another big object on the stack
}

Если Вы не будете использовать массивы (и Вы не были должны), затем, то большинство вещей будет выделено для Вас на "куче":

void h() {
   std::string s( 100000 );
}

вышеупомянутое выделяет несколько байтов на стеке для указателей, информация о размере и т.д. и затем выделяет настоящее хранение на "куче".

Так прекратите волноваться! Вы, вероятно, делаете вещи правильно!

3
ответ дан 6 December 2019 в 09:22
поделиться

1. Как определить, что объект является большим или нет?

Используйте "sizeof"

class c {
  std::vector<std::string> s;
};

международный размер = sizeof (c);

На моей машине "размер" 16 байтов.

2. Каков будет размер максимума стека? Каждая ОС будет иметь различный размер стека?

Вы не можете сказать, но это - определенно не хорошее место для выделения масс данных.

3. У меня есть класс обертки, который переносит вектор. Это будет иметь приблизительно 100 объектов. Это сделает переполнение стека, если я выделю этот класс стеку? Я попробовал это, но это работало отлично. Не уверенный я делаю что-то не так.

Нет. станд.:: вектор выделяет эти 100 объектов в "куче".

1
ответ дан 6 December 2019 в 09:22
поделиться

Как определить, что объект является большим или нет?

Зависит от Вашей комбинации компилятора/платформы. Нет никакого Истинного предела. Компиляторы часто позволяют Вам настраивать это.

Каков будет размер максимума стека? Каждая ОС будет иметь различный размер стека?

Зависит главным образом как выше. Только вещь Вы имеете меньше контроля над настройкой.

У меня есть класс обертки, который переносит вектор. Это будет иметь приблизительно 100 объектов. Это сделает переполнение стека, если я выделю этот класс стеку? Я попробовал это, но это работало отлично. Не уверенный я делаю что-то не так.

Будет работать, пока требование общей памяти этой обертки и других объектов в том блоке не превышает Ваш размер стекового фрейма. Который в свою очередь зависит в среднем строка sie.

Хорошая идея состоит в том, чтобы ступить через отладчик и видеть адреса стека - это даст Вам запуск ширины в некоторой степени. И документация.

1
ответ дан 6 December 2019 в 09:22
поделиться

Еще один момент, который я упомяну, является этим потому что vector<> должен смочь изменить размер себя, если это становится достаточно большим (см. ниже), это должно использовать "кучу" для хранения ее содержащих в нем объектов, даже если vector<> самостоятельно объявляется как переменная стека.

[РЕДАКТИРОВАНИЕ] Как Motti указывает в комментарии, это возможно это vector<> резервирует небольшое количество пространства в его выделенном стеку объекте как оптимизация для маленьких векторов. В этом случае работа с векторами, достаточно маленькими для установки в этом пространстве, не потребует никаких выделений "кучи". (Это предварительно выделенное пространство должно быть довольно небольшим, чтобы не тратить впустую пространство при работе с меньшими векторами.) Независимо, если вектор становится достаточно большим, он потребует (пере-) выделения на "куче".

1
ответ дан 6 December 2019 в 09:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: