L>Я в общем на этом A() + почленная инициализация и не настаивал, можно же как было упомянуто, унаследоваться и запаять параметризованный конструктор, медленнее точно небылобы + почти не зависит от оптимизатора...
Оба приведенных ниже варианта зависят от встройки, так что "почти не зависит" неверное утверждение.
А так, варианты:
inline A make_A(int a, int b)
{
A temp = {a, b};
return temp;
}
и
struct initializer_A : A
{
initializer_A(int a, int b) /*: A() */
{
this->a = a;
this->b = b;
}
};
конечно же, должны быть равнозначны по скорости. Но, оговорюсь, надо профилировать, чтобы сделать окончательный вывод.
А теперь, не будем показывать пальцами, но именно в Вашем решение с наследованием вызывается конструктор по умолчанию, хотя не далее как в 13:04 Вы ревностно к этому самому вызову относились (хотя его и не было):
Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!!
"Это как же, вашу мать!
Извиняюсь, понимать?" (с) ...
Все это, конечно, хорошо. Я про make_a и наследование. А если я работаю со стандартными структурами (например что-то из boost) и таких структур/ситуаций довольно много. Что же мне, от каждой наследоваться? Меня вообще скорее интересовало не быстродействие а const о котором я упоминал . И вот мне показалось что вроде это весьма типичная ситуация и должны быть механизмы, позволяющие решать мою проблему без введения новых сущностей(классов, функций). Сам я их на вскидку не придумал. Но видимо их и нет…
Здравствуйте, Анатолий Широков, Вы писали:
L>>Я в общем на этом A() + почленная инициализация и не настаивал, можно же как было упомянуто, унаследоваться и запаять параметризованный конструктор, медленнее точно небылобы + почти не зависит от оптимизатора...
АШ>Оба приведенных ниже варианта зависят от встройки, так что "почти не зависит" неверное утверждение.
АШ>А так, варианты:
АШ>
АШ>inline A make_A(int a, int b)
АШ>{
АШ> A temp = {a, b};
АШ> return temp;
АШ>}
АШ>
АШ>и
АШ>
АШ>struct initializer_A : A
АШ>{
АШ> initializer_A(int a, int b) /*: A() */
АШ> {
this->>a = a;
this->>b = b;
АШ> }
АШ>};
АШ>
АШ>конечно же, должны быть равнозначны по скорости. Но, оговорюсь, надо профилировать, чтобы сделать окончательный вывод.
АШ>А теперь, не будем показывать пальцами, но именно в Вашем решение с наследованием вызывается конструктор по умолчанию, хотя не далее как в 13:04 Вы ревностно к этому самому вызову относились (хотя его и не было): АШ>
АШ>Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!!
АШ>"Это как же, вашу мать! АШ>Извиняюсь, понимать?" (с) ...
Совсем я на этой работе опух!!! Виноватая я..... да ссучара вызывается
"Признаю свою вину
меру степень глубуну..." (с) ...
Здравствуйте, SergeyBi, Вы писали:
SB>Все это, конечно, хорошо. Я про make_a и наследование. А если я работаю со стандартными структурами (например что-то из boost) и таких структур/ситуаций довольно много. Что же мне, от каждой наследоваться? Меня вообще скорее интересовало не быстродействие а const о котором я упоминал . И вот мне показалось что вроде это весьма типичная ситуация и должны быть механизмы, позволяющие решать мою проблему без введения новых сущностей(классов, функций). Сам я их на вскидку не придумал. Но видимо их и нет…
Здравствуйте, Анатолий Широков, Вы писали:
__>>Ну тогда кроме функции действительно нет ничего лучше. __>>Можно это улучшить, сделав в виде макроса если таких структур много.
АШ>Ага, что-то в этом роде выйдет:
АШ>
Здравствуйте, Анатолий Широков, Вы писали:
__>>Вот если добавить inline перед этим то будет вообще счастье =)
АШ>Эх, поторопился. Конечно, там inline, куда же без него
Можно еще и const добавить, не помешает
template<typename T, typename P1>
inlineconst T initializer(P1 p1)
{
T tmp = {p1};
return tmp;
}
Lapulya:
> Ну тут я и не спорю у меня сомнения по поводу этого > >
> inline A make_A(int a, int b)
> {
> A temp = {a, b};
> return temp;
> }
>
> SomeClass::SomeClass():
> a(make_A(0, 10))
> {
> }
>
Компилятор вполне может в данном случае обойтись без создания временного объекта. Даже без встраивания функции make_A. Это называется NRVO (Named Return Value Optimization). Специально для поддержания этого и аналогичных случаев в стандарте есть указание что конструктор копирования может не быть вызван.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен