Требует ли метод локальной структуры выполнения конструктора по умолчанию - PullRequest
2 голосов
/ 25 октября 2011

Когда вы объявляете struct в методе класса, как распределяется память для этого struct?Например:

void Foo::Bar(void)
{
    struct timeval a;

    a.tv_sec = 1;
    a.tv_usec = 0;

    ...
}

Распределяется ли в стеке, как любые другие локальные данные (int, double и т. Д.), Или вызывается конструктор по умолчанию и память выделяется в куче?

А что, если struct инициализируется так: struct timeval a = {0, 0};?

Попытка решить, лучше ли сделать структуру членом класса или иметь ее как локальный метод, так какметод вызывается довольно часто и должен быть максимально быстрым.

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Распределяется ли в стеке, как любые другие локальные данные (int, double и т. Д.), Или вызывается конструктор по умолчанию, а память выделяется в куче?

Распределяется на локальное хранилище (стек).
Объект будет создан в Freestore (куче) только в том случае, если при его создании используется любая из new версий операторов (за исключением, возможно, размещения новых).
Кроме того, ваш объект структуры не сохраняется за рамками функции, в которую он включен. Объект Freestore (Heap) будет сохраняться до тех пор, пока вы явно не вызовете delete для него.

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

А что если структура инициализируется так: struct timeval a = {0, 0};

Он все еще выделен как объект с локальным хранилищем.

Попытка решить, лучше ли сделать структуру членом класса или иметь его как локальный метод, поскольку метод вызывается довольно часто и должен быть максимально быстрым.

Создание объектов в локальном хранилище (стеке) происходит быстрее, чем их создание в Freestore (Heap). Тем не менее, в вашем случае вы вообще не используете кучу.

Фактическое профилирование примера кода скажет вам, какой из них (локальная структура или член класса) лучше соответствует вашим требованиям к производительности.

Однако, подумайте, как структура связана с вашим классом, прежде чем сделать его членом. Имеет ли он отношение has a к вашему классу или это просто служебная структура. Вы должны учитывать этот аспект дизайна.

Также существует несколько ограничений в том, что может быть доступно внутри локальной структуры или класса, так что имейте это в виду.

1 голос
/ 25 октября 2011

В вашем примере объект размещается в стеке, и вызывается конструктор по умолчанию.

...