Я могу заводить объект структуры и сразу задавать значения следущим способом:
A a = {0,0};
А как мне быть если я хочу воспользоваться чем-то подобным в списке инициализации в конструкторе...
SomeClass::SomeClass():
a{0,0}// что здесь написать чтобы работало?
{
}
Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...
Здравствуйте, SergeyBi, Вы писали:
SB>Пусть у меня есть некая структура:
SB>
SB>struct A
SB>{
SB> int a;
SB> int b;
SB>};
SB>
SB>Я могу заводить объект структуры и сразу задавать значения следущим способом:
SB>
SB>A a = {0,0};
SB>
SB>А как мне быть если я хочу воспользоваться чем-то подобным в списке инициализации в конструкторе...
SB>
SB>SomeClass::SomeClass():
SB>a{0,0}// что здесь написать чтобы работало?
SB>{
SB>}
SB>
SB>Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...
Здравствуйте, SergeyBi, Вы писали:
SB>Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...
Здравствуйте, Esperar, Вы писали:
E>Здравствуйте, SergeyBi, Вы писали:
SB>>Пусть у меня есть некая структура:
SB>>
SB>>struct A
SB>>{
SB>> int a;
SB>> int b;
SB>>};
SB>>
SB>>Я могу заводить объект структуры и сразу задавать значения следущим способом:
SB>>
SB>>A a = {0,0};
SB>>
SB>>А как мне быть если я хочу воспользоваться чем-то подобным в списке инициализации в конструкторе...
SB>>
SB>>SomeClass::SomeClass():
SB>>a{0,0}// что здесь написать чтобы работало?
SB>>{
SB>>}
SB>>
SB>>Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...
SB>И что это ? Структура не моя, я не могу ее править, иначе добавилбы конструкторы в нее.
но ты ведь можешь от неё наследоваться
Re: Инициализация.
От:
Аноним
Дата:
15.09.04 17:10
Оценка:
SB>Я могу заводить объект структуры и сразу задавать значения следущим способом: SB>
SB>A a = {0,0};
SB>
SB>А как мне быть если я хочу воспользоваться чем-то подобным в списке инициализации в конструкторе... SB>
SB>SomeClass::SomeClass():
SB>a{0,0}// что здесь написать чтобы работало?
SB>
SomeClass::SomeClass : a(0), b(0) { }
SB>Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...
Что-то вопрос непонятен. О каком конструкторе речь? Пишите или конструктор как показано выше или просто ставьте const перед инициализацией через скобки: const A a = { 0, 0 };
предлагаю тому анониму, который дал "не традиционный" ответ постучать мне в аську, и я обсужу с ним тему, которая его волнует. (67945507)
Re[2]: Инициализация.
От:
Аноним
Дата:
16.09.04 09:04
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:
АШ>
АШ>inline A make_A(int a, int b)
АШ>{
АШ> A temp = {a, b};
АШ> return temp;
АШ>}
АШ>SomeClass::SomeClass():
АШ> a(make_A(0, 10))
АШ>{
АШ>}
АШ>
Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!! ну а в предложеном варианте аж временный объект создается
А>Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!! ну а в предложеном варианте аж временный объект создается
Если оптимизатор правильно разберется в этой ситуации, то временного объекта может и не будет.
Здравствуйте, Анатолий Широков, Вы писали:
А>>Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!! ну а в предложеном варианте аж временный объект создается
АШ>Если оптимизатор правильно разберется в этой ситуации, то временного объекта может и не будет.
Чегой-то у меня большие сомнения по этому поводу...
я еще могу понять это
typedef std::string String;
void f(String a)
{
// using a
...
}
{
...
f("abcd");
...
}
что он тут не создается ... но в приведенном примере не создавать временный оъбект??? как же ваш код должен работать... И потом всетаки полагаться на оптимизатор когда скорость критична мммммм я бы не стал...
L>я еще могу понять это
L>что он тут не создается ...
Без комментариев.
L>но в приведенном примере не создавать временный оъбект??? как же ваш код должен работать...
Например, комплилятор вместо адрес объекта на стеке может подставить адрес this->a.
L>И потом всетаки полагаться на оптимизатор когда скорость критична мммммм я бы не стал...
Одним словом, надо профилировать, а не гадать на кофейной гуще. Если функция make_A окажется узким местов в системе, тогда и будем репу чесать
Здравствуйте, Анатолий Широков, Вы писали:
L>>я еще могу понять это
L>>что он тут не создается ...
АШ>Без комментариев.
L>>но в приведенном примере не создавать временный оъбект??? как же ваш код должен работать...
АШ>Например, комплилятор вместо адрес объекта на стеке может подставить адрес this->a.
L>>И потом всетаки полагаться на оптимизатор когда скорость критична мммммм я бы не стал...
АШ>Одним словом, надо профилировать, а не гадать на кофейной гуще. Если функция make_A окажется узким местов в системе, тогда и будем репу чесать
Да причем здесь гадания, человек ясно сказал что его жаба душит вызывать конструктор по умолчанию.... только и всего и то ничего не придумываю
L>Да причем здесь гадания, человек ясно сказал что его жаба душит вызывать конструктор по умолчанию.... только и всего и то ничего не придумываю
В приведенном решении нет ни одного вызова конструктора по умолчанию!!! А вызова копирующего конструктора может и не быть, если оптимизатор сделает правильную подстановку (ведь функция объявлена как inline).
Здравствуйте, Анатолий Широков, Вы писали:
L>>Да причем здесь гадания, человек ясно сказал что его жаба душит вызывать конструктор по умолчанию.... только и всего и то ничего не придумываю
АШ>В приведенном решении нет ни одного вызова конструктора по умолчанию!!! А вызова копирующего конструктора может и не быть, если оптимизатор сделает правильную подстановку (ведь функция объявлена как inline).
да я в общем не спорю я просто говорю, (еще разок код в студию)
inline A make_A(int a, int b)
{
A temp = {a, b};
return temp;
}
SomeClass::SomeClass():
a(make_A(0, 10))
{
}
что для того что бы это работало быстрее чем вызов конструктора по умолчанию, а затем естессно заполненние членов нужными значениями, нодо
1. чтобы компилятор встроил код функции объявленной как inline.
2. чтобы оптимизатор не создавал временного объекта.
мне кажется это не лучший вариант , хотя если оба пункта выполнены это как раз то, чего хотел автор темы
L>что для того что бы это работало быстрее чем вызов конструктора по умолчанию, а затем естессно заполненние членов нужными значениями, нодо L>1. чтобы компилятор встроил код функции объявленной как inline. L>2. чтобы оптимизатор не создавал временного объекта.
Эти два пункта можно заменить одним:
1) компилятор правильно встроил функцию
L>мне кажется это не лучший вариант , хотя если оба пункта выполнены это как раз то, чего хотел автор темы
Помимо этого, автор хотел, чтобы была возможность инициализировать константный член, а это невозможно сделать связкой A() + почленная инициализация. Цитирую:
Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...
Здравствуйте, Анатолий Широков, Вы писали:
L>>что для того что бы это работало быстрее чем вызов конструктора по умолчанию, а затем естессно заполненние членов нужными значениями, нодо L>>1. чтобы компилятор встроил код функции объявленной как inline. L>>2. чтобы оптимизатор не создавал временного объекта.
АШ>Эти два пункта можно заменить одним: АШ>1) компилятор правильно встроил функцию
L>>мне кажется это не лучший вариант , хотя если оба пункта выполнены это как раз то, чего хотел автор темы
АШ>Помимо этого, автор хотел, чтобы была возможность инициализировать константный член, а это невозможно сделать связкой A() + почленная инициализация. Цитирую:
АШ>
АШ>Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...
Я в общем на этом A() + почленная инициализация и не настаивал, можно же как было упомянуто, унаследоваться и запаять параметризованный конструктор, медленнее точно небылобы + почти не зависит от оптимизатора...
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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен