Re[5]: Константы класса в метапрограммировании
От: drx США  
Дата: 30.08.07 06:00
Оценка:
Здравствуйте, igna, Вы писали:

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


drx>>A строка вида &EnumElement всегда приведёт к ошибке компиляции.

I>Не приведет.
Извини, я, наверное, не совсем ясно выразился. Конечно, я имел ввиду следующий код:
enum Enum { ENUM_ELEMENT };

void const * f()
{
    return & ENUM_ELEMENT; 
}


В то время, как вызов foo( ENUM_ELEMENT ), скорей всего, разворачивается в что-то вроде foo( int( ENUM_ELEMENT ) ).

drx>>Таким образом, константа будет жить не только во время компиляции и "pure compile-time effect" пропадает.

I>Разве нельзя точно также порассуждать по поводу enum?
Как видишь, нет
Re[6]: Константы класса в метапрограммировании
От: igna Россия  
Дата: 30.08.07 06:15
Оценка:
Здравствуйте, drx, Вы писали:

drx>В то время, как вызов foo( ENUM_ELEMENT ), скорей всего, разворачивается в что-то вроде foo( int( ENUM_ELEMENT ) ).


Разве для этого int( ENUM_ELEMENT ) не будет выделена (имеющая адрес) память?
Re[4]: Константы класса в метапрограммировании
От: Erop Россия  
Дата: 30.08.07 06:17
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Согласен. Кстати, компилятору запрещено соптимизировать этот int, если он используется только как аргумент встраиваемой функции?

Ну оптимизировать некуда. У элемента перечисления нет адреса, так же как нет адреса у числового литерала, то есть в коде
f( 5 );
f( enum_element );
f( static_const_value );
первые два оператора совершенно эквивалентны, а последний позволяет использовать адрес static_const_value, что якобы может исключаеть CT-эффекты, что и не нравится...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Константы класса в метапрограммировании
От: drx США  
Дата: 30.08.07 06:19
Оценка:
Здравствуйте, igna, Вы писали:

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


drx>>В то время, как вызов foo( ENUM_ELEMENT ), скорей всего, разворачивается в что-то вроде foo( int( ENUM_ELEMENT ) ).

I>Разве для этого int( ENUM_ELEMENT ) не будет выделена (имеющая адрес) память?

А разве временный (выделенный жирным) int
foo( int( ENUM_ELEMENT ) )

Не имеет адреса?
Re[6]: Константы класса в метапрограммировании
От: igna Россия  
Дата: 30.08.07 06:28
Оценка:
Здравствуйте, drx, Вы писали:

drx>Извини, я, наверное, не совсем ясно выразился. Конечно, я имел ввиду следующий код:

drx>enum Enum { ENUM_ELEMENT };

drx>void const * f()
drx>{
drx>    return & ENUM_ELEMENT; 
drx>}


Думаю, ты выразился ясно; это я, просто не ожидав, что ты имеешь ввиду именно не имеющую прямого отношения к рассматриваемому случаю операцию взятия адреса, подумал, что ты о том скрытом взятии адреса, которое осуществляет компилятор передавая функции с параметром int const& аргумент ENUM_ELEMENT.
Re[8]: Константы класса в метапрограммировании
От: igna Россия  
Дата: 30.08.07 06:30
Оценка:
Здравствуйте, drx, Вы писали:

drx>А разве временный (выделенный жирным) int

drx>foo( int( ENUM_ELEMENT ) )

drx>Не имеет адреса?

Имеет. И будет "жить" во время исполнения, разве не так?
Re[5]: Константы класса в метапрограммировании
От: igna Россия  
Дата: 30.08.07 06:37
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну оптимизировать некуда. У элемента перечисления нет адреса, так же как нет адреса у числового литерала, то есть в коде
E>f( 5 );
E>f( enum_element );
E>f( static_const_value );
первые два оператора совершенно эквивалентны, а последний позволяет использовать адрес static_const_value, что якобы может исключаеть CT-эффекты, что и не нравится...


Хорошо, у элемента перечисления нет адреса, но адрес есть у временной переменной, в которую копируется 5 или enum_element. Эта временная переменная может быть соптимизирована, если f встраиваемая. Почему точно также не может быть соптимизирована статическая константа?
Re[6]: Константы класса в метапрограммировании
От: Erop Россия  
Дата: 30.08.07 06:45
Оценка:
Здравствуйте, igna, Вы писали:

I>Хорошо, у элемента перечисления нет адреса, но адрес есть у временной переменной, в которую копируется 5 или enum_element. Эта временная переменная может быть соптимизирована, если f встраиваемая. Почему точно также не может быть соптимизирована статическая константа?


потому, что у неё адрес уже есть.
Ну типа:
void f_impl( const int& );
void f( const int &i ) { f_impl( &i ); }

//  Код 
f( enum_item );
// эквивалентен такому:
const int tmp = enum_item;
f_ptr( &tmp );

// а код
f( static_const_value );
// эквивалентен такому:
f_ptr( &static_const_value );


Совсем никто не обещал, что они будут оптимизироваться одинаково...
Мало того, часто реально неодинаково используются, например из asm'а
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Константы класса в метапрограммировании
От: igna Россия  
Дата: 30.08.07 06:55
Оценка:
Здравствуйте, Erop, Вы писали:

E>Совсем никто не обещал, что они будут оптимизироваться одинаково...


А вот этого "одинаково" я и не утверждал; а лишь спрашивал, "запрещено ли компилятору соптимизировать этот int" (константу класса). То есть написано ли где-то в стандарте, что если такая константа используется как lvalue, то оптимизировать ее запрещено.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.