Re: Инициализация.
От: Анатолий Широков СССР  
Дата: 15.09.04 13:07
Оценка: 9 (4) +2
inline A make_A(int a, int b)
{
   A temp = {a, b};
   return temp;
}

SomeClass::SomeClass():
   a(make_A(0, 10))
{
}
Re[13]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 14:29
Оценка: 3 (1)
Здравствуйте, SergeyBi, Вы писали:

SB>Все это, конечно, хорошо. Я про make_a и наследование. А если я работаю со стандартными структурами (например что-то из boost) и таких структур/ситуаций довольно много. Что же мне, от каждой наследоваться? Меня вообще скорее интересовало не быстродействие а const о котором я упоминал . И вот мне показалось что вроде это весьма типичная ситуация и должны быть механизмы, позволяющие решать мою проблему без введения новых сущностей(классов, функций). Сам я их на вскидку не придумал. Но видимо их и нет…


А как тебе такое решение: http://www.rsdn.ru/Forum/Message.aspx?mid=811923&only=1
Автор: Анатолий Широков
Дата: 16.09.04
?
Re[5]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 11:11
Оценка: 1 (1)
L>я еще могу понять это

L>что он тут не создается ...


Без комментариев.

L>но в приведенном примере не создавать временный оъбект??? как же ваш код должен работать...


Например, комплилятор вместо адрес объекта на стеке может подставить адрес this->a.

L>И потом всетаки полагаться на оптимизатор когда скорость критична мммммм я бы не стал...


Одним словом, надо профилировать, а не гадать на кофейной гуще. Если функция make_A окажется узким местов в системе, тогда и будем репу чесать
Re[4]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 14:28
Оценка: 1 (1)
__>Ну тогда кроме функции действительно нет ничего лучше.
__>Можно это улучшить, сделав в виде макроса если таких структур много.

Ага, что-то в этом роде выйдет:

template<typename T, typename P1>
T initializer(P1 p1)
{
    T tmp = {p1};
    return tmp;
}

template<typename T, typename P1, typename P2>
T initializer(P1 p1, P2 p2)
{
    T tmp = {p1, p2};
    return tmp;
}

template<typename T, typename P1, typename P2, typename P3>
T initializer(P1 p1, P2 p2, P3 p3)
{
    T tmp = {p1, p2, p3};
    return tmp;
}

struct foo {int a; const char *b;};
struct boo {int a; double b;};

struct B 
{
    B() : f(initializer<foo>(1, "test")), b(initializer<boo>(10, 1))
    {
    }
    foo f;
    boo b;
};
Re[11]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 12:50
Оценка: +1
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  
Дата: 15.09.04 13:00
Оценка:
Пусть у меня есть некая структура:


struct A
{
    int a;
    int b;
};


Я могу заводить объект структуры и сразу задавать значения следущим способом:


A a = {0,0};



А как мне быть если я хочу воспользоваться чем-то подобным в списке инициализации в конструкторе...


SomeClass::SomeClass():
a{0,0}// что здесь написать чтобы работало?
{

}



Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...
Re: Инициализация.
От: Esperar  
Дата: 15.09.04 13:02
Оценка:
Здравствуйте, 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 и поэтому мне просто необходимо инициализировать ее в списке...



class A{
   int a,b;
public:
   a(0), b(0) {/*...*/}

};
Re: Инициализация.
От: korzhik Россия  
Дата: 15.09.04 13:03
Оценка:
Здравствуйте, SergeyBi, Вы писали:

SB>Опережая вопросы сразу скажу зачем мне это надо. У структуры нет конструкторов. И я хочу ее конструировать в списке инициализации.(чтобы сначала не работал конструктор по умолчанию). Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...


без конструктора не обойдёшься
Re[2]: Инициализация.
От: Esperar  
Дата: 15.09.04 13:03
Оценка:
Здравствуйте, 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 и поэтому мне просто необходимо инициализировать ее в списке...


исправился типа:
E>
E>class A{
E>   int a,b;
E>public:
E>   A():a(0), b(0) {/*...*/}

E>};
E>
Re[3]: Инициализация.
От: SergeyBi  
Дата: 15.09.04 13:09
Оценка:
E>>
E>>class A{
E>>   int a,b;
E>>public:
E>>   A():a(0), b(0) {/*...*/}

E>>};
E>>


И что это ? Структура не моя, я не могу ее править, иначе добавилбы конструкторы в нее.
Re[4]: Инициализация.
От: Esperar  
Дата: 15.09.04 13:35
Оценка:
Здравствуйте, SergeyBi, Вы писали:


E>>>
E>>>class A{
E>>>   int a,b;
E>>>public:
E>>>   A():a(0), b(0) {/*...*/}

E>>>};
E>>>


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 };

Censored. Нарушение п. 5. -- ПК
Re: Инициализация.
От: SergeyBi  
Дата: 16.09.04 08:03
Оценка:
предлагаю тому анониму, который дал "не традиционный" ответ постучать мне в аську, и я обсужу с ним тему, которая его волнует. (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))
АШ>{
АШ>}
АШ>


Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!! ну а в предложеном варианте аж временный объект создается
Re[3]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 09:14
Оценка:
А>Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!! ну а в предложеном варианте аж временный объект создается

Если оптимизатор правильно разберется в этой ситуации, то временного объекта может и не будет.
Re[4]: Инициализация.
От: Lapulya  
Дата: 16.09.04 10:54
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!! ну а в предложеном варианте аж временный объект создается


АШ>Если оптимизатор правильно разберется в этой ситуации, то временного объекта может и не будет.


Чегой-то у меня большие сомнения по этому поводу...
я еще могу понять это

typedef std::string String;

void f(String a)
{
// using a
...
}

{
...
f("abcd");
...
}

что он тут не создается ... но в приведенном примере не создавать временный оъбект??? как же ваш код должен работать... И потом всетаки полагаться на оптимизатор когда скорость критична мммммм я бы не стал...
Re[5]: Инициализация.
От: ssm Россия  
Дата: 16.09.04 11:02
Оценка:
Здравствуйте, Lapulya, Вы писали:


L>я еще могу понять это


еще как cоздастся в "это"
Re[6]: Инициализация.
От: Lapulya  
Дата: 16.09.04 11:13
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Lapulya, Вы писали:



L>>я еще могу понять это


ssm>еще как cоздастся в "это"


Ну тут я и не спорю у меня сомнения по поводу этого

inline A make_A(int a, int b)
{
   A temp = {a, b};
   return temp;
}

SomeClass::SomeClass():
   a(make_A(0, 10))
{
}
Re[6]: Инициализация.
От: Lapulya  
Дата: 16.09.04 11:37
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

L>>я еще могу понять это


L>>что он тут не создается ...


АШ>Без комментариев.


L>>но в приведенном примере не создавать временный оъбект??? как же ваш код должен работать...


АШ>Например, комплилятор вместо адрес объекта на стеке может подставить адрес this->a.


L>>И потом всетаки полагаться на оптимизатор когда скорость критична мммммм я бы не стал...


АШ>Одним словом, надо профилировать, а не гадать на кофейной гуще. Если функция make_A окажется узким местов в системе, тогда и будем репу чесать


Да причем здесь гадания, человек ясно сказал что его жаба душит вызывать конструктор по умолчанию.... только и всего и то ничего не придумываю
Re[7]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 11:45
Оценка:
L>Да причем здесь гадания, человек ясно сказал что его жаба душит вызывать конструктор по умолчанию.... только и всего и то ничего не придумываю

В приведенном решении нет ни одного вызова конструктора по умолчанию!!! А вызова копирующего конструктора может и не быть, если оптимизатор сделает правильную подстановку (ведь функция объявлена как inline).
Re[8]: Инициализация.
От: Lapulya  
Дата: 16.09.04 12:04
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

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. чтобы оптимизатор не создавал временного объекта.
мне кажется это не лучший вариант , хотя если оба пункта выполнены это как раз то, чего хотел автор темы
Re[9]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 12:11
Оценка:
L>что для того что бы это работало быстрее чем вызов конструктора по умолчанию, а затем естессно заполненние членов нужными значениями, нодо
L>1. чтобы компилятор встроил код функции объявленной как inline.
L>2. чтобы оптимизатор не создавал временного объекта.

Эти два пункта можно заменить одним:
1) компилятор правильно встроил функцию

L>мне кажется это не лучший вариант , хотя если оба пункта выполнены это как раз то, чего хотел автор темы


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

Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...

Re[10]: Инициализация.
От: Lapulya  
Дата: 16.09.04 12:19
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

L>>что для того что бы это работало быстрее чем вызов конструктора по умолчанию, а затем естессно заполненние членов нужными значениями, нодо

L>>1. чтобы компилятор встроил код функции объявленной как inline.
L>>2. чтобы оптимизатор не создавал временного объекта.

АШ>Эти два пункта можно заменить одним:

АШ>1) компилятор правильно встроил функцию

L>>мне кажется это не лучший вариант , хотя если оба пункта выполнены это как раз то, чего хотел автор темы


АШ>Помимо этого, автор хотел, чтобы была возможность инициализировать константный член, а это невозможно сделать связкой A() + почленная инициализация. Цитирую:


АШ>

АШ>Во вторых у объекта a я хочу поставить модификатор const и поэтому мне просто необходимо инициализировать ее в списке...


Я в общем на этом A() + почленная инициализация и не настаивал, можно же как было упомянуто, унаследоваться и запаять параметризованный конструктор, медленнее точно небылобы + почти не зависит от оптимизатора...
Re[12]: Инициализация.
От: SergeyBi  
Дата: 16.09.04 13:29
Оценка:
Все это, конечно, хорошо. Я про make_a и наследование. А если я работаю со стандартными структурами (например что-то из boost) и таких структур/ситуаций довольно много. Что же мне, от каждой наследоваться? Меня вообще скорее интересовало не быстродействие а const о котором я упоминал . И вот мне показалось что вроде это весьма типичная ситуация и должны быть механизмы, позволяющие решать мою проблему без введения новых сущностей(классов, функций). Сам я их на вскидку не придумал. Но видимо их и нет…
Re: Инициализация.
От: _nn_ www.nemerleweb.com
Дата: 16.09.04 13:37
Оценка:
Здравствуйте, SergeyBi, Вы писали:

А чем вас не устраивает так:
struct A
{
    int a;
    int b;
};

class B
{
    A a;
public:
    B(int sa,int sb)
    {
        a.a=sa;
        a.b=sb;
    }
};


Тест:
int main()
{
    const B b(1,2);
}


Все работает как ожидалось и с модификатором const. (VC 8.0)
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[12]: Инициализация.
От: Lapulya  
Дата: 16.09.04 14:00
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

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 Вы ревностно к этому самому вызову относились (хотя его и не было):

АШ>

АШ>Думаю это не катит... человек же что говорит "чтобы сначала не работал конструктор по умолчанию" — видимо скорость критична!!!


АШ>"Это как же, вашу мать!

АШ>Извиняюсь, понимать?" (с) ...

Совсем я на этой работе опух!!! Виноватая я..... да ссучара вызывается

"Признаю свою вину
меру степень глубуну..." (с) ...
Re[2]: Инициализация.
От: Lapulya  
Дата: 16.09.04 14:03
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, SergeyBi, Вы писали:


__>А чем вас не устраивает так:

__>
__>struct A
__>{
__>    int a;
__>    int b;
__>};

__>class B
__>{
__>    A a;
__>public:
__>    B(int sa,int sb)
__>    {
__>        a.a=sa;
__>        a.b=sb;
__>    }
__>};
__>


__>Тест:

__>
__>int main()
__>{
__>    const B b(1,2);
__>}
__>


__>Все работает как ожидалось и с модификатором const. (VC 8.0)


как уже было сказано, нас не устраивает это тем, что хотим вот так


struct A
{
   int a;
   int b;
};

class B
{
   const A a;
};
Re[3]: Инициализация.
От: _nn_ www.nemerleweb.com
Дата: 16.09.04 14:17
Оценка:
Здравствуйте, Lapulya, Вы писали:


L>как уже было сказано, нас не устраивает это тем, что хотим вот так



L>
L>struct A
L>{
L>   int a;
L>   int b;
L>};

L>class B
L>{
L>   const A a;
L>};
L>


Ой, я const не туда поставил

Ну тогда кроме функции действительно нет ничего лучше.
Можно это улучшить, сделав в виде макроса если таких структур много.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Инициализация.
От: _nn_ www.nemerleweb.com
Дата: 16.09.04 14:35
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

__>>Ну тогда кроме функции действительно нет ничего лучше.

__>>Можно это улучшить, сделав в виде макроса если таких структур много.

АШ>Ага, что-то в этом роде выйдет:


АШ>
АШ>template<typename T, typename P1>
АШ>T initializer(P1 p1)
АШ>{
АШ>    T tmp = {p1};
АШ>    return tmp;
АШ>}

АШ>template<typename T, typename P1, typename P2>
АШ>T initializer(P1 p1, P2 p2)
АШ>{
АШ>    T tmp = {p1, p2};
АШ>    return tmp;
АШ>}

АШ>template<typename T, typename P1, typename P2, typename P3>
АШ>T initializer(P1 p1, P2 p2, P3 p3)
АШ>{
АШ>    T tmp = {p1, p2, p3};
АШ>    return tmp;
АШ>}

АШ>struct foo {int a; const char *b;};
АШ>struct boo {int a; double b;};

АШ>struct B 
АШ>{
АШ>    B() : f(initializer<foo>(1, "test")), b(initializer<boo>(10, 1))
АШ>    {
АШ>    }
АШ>    foo f;
АШ>    boo b;
АШ>};
АШ>


Вот если добавить inline перед этим то будет вообще счастье =)
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Инициализация.
От: Анатолий Широков СССР  
Дата: 16.09.04 14:39
Оценка:
__>Вот если добавить inline перед этим то будет вообще счастье =)

Эх, поторопился. Конечно, там inline, куда же без него
Re[14]: Инициализация.
От: SergeyBi  
Дата: 16.09.04 15:26
Оценка:
АШ>А как тебе такое решение: http://www.rsdn.ru/Forum/Message.aspx?mid=811923&amp;only=1
Автор: Анатолий Широков
Дата: 16.09.04
?



Да, пожалуй, выход найден Жаль все же что нет средств языка.
Re[7]: Инициализация.
От: _nn_ www.nemerleweb.com
Дата: 16.09.04 15:30
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

__>>Вот если добавить inline перед этим то будет вообще счастье =)


АШ>Эх, поторопился. Конечно, там inline, куда же без него


Можно еще и const добавить, не помешает
template<typename T, typename P1>
inline const T initializer(P1 p1)
{
    T tmp = {p1};
    return tmp;
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: Инициализация.
От: Павел Кузнецов  
Дата: 23.09.04 22:40
Оценка:
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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.