В структуре C ++, в чем разница между значением по умолчанию и аргументом по умолчанию в конструкторе? - PullRequest
0 голосов
/ 26 апреля 2019

для структуры Foo; В чем разница с точки зрения производительности, операций с памятью и т. Д. Между

struct Foo {
 int foo = 1;
};

против

struct Foo {
Foo(int haha = 1) : foo(haha) {}
int foo;
};

Что предпочтительнее использовать?

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Нет настоящей разницы.

Каждый современный компилятор (например, GCC, Clang, MSVC) оптимизирует любые различия между ними. Например, этот код:

struct Foo {
    int foo = 1;
};

struct Bar {
    int bar;
    Bar(int value = 2) : bar(value) {}
};

void test() {
    auto f = Foo();
    auto b = Bar();
    keep(b);
}

будет скомпилировано для этого GCC с самым низким уровнем оптимизации (-O1):

test():
        mov     eax, 1  // auto f = Foo();
        mov     eax, 2  // auto b = Bar();
        ret

( Источник )

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


Моя точка зрения заключается в том, что на самом деле нет никакого смысла в выполнении такого уровня ручной оптимизации, если у вас крайне нехватка ресурсов, поскольку компилятор почти всегда умнее вас и может оптимизировать их. вещи для скорости / памяти лучше, чем вы можете сделать вручную.

Вместо этого вы должны сделать свой выбор, основываясь на том, что вы считаете самым ясным кодом. Это единственная мысль, которая имеет значение здесь.

0 голосов
/ 26 апреля 2019

Это во многом зависит от вашего компилятора. Я поместил ваш код в CompilerExplorer, и вот что я нашел: https://godbolt.org/z/5WmOno

Они очень похожи, но первый способ более эффективен. В случае int foo = 1; значение используется непосредственно в конструкторе. В другом случае это значение помещается в стек вызывающей стороной конструктора, даже если это значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...