Re: Умный вопрос по C/C++
От: Аноним  
Дата: 04.04.08 13:56
Оценка:
Здравствуйте, McSeem2, Вы писали:

...

Хорошо. Но вот правильно ли я понимаю, что такой код тоже не всегда будет работать?

typedef struct
{
   int type;
} BaseObject;

typedef struct
{
   int type;

   int foo;
} DerivedObject;

enum
{
  OBJTYPE_UNDEFINED,
  OBJTYPE_DERIVED,
  /* ... */
};

...

void incFoo( BaseObject * d )
{
   if( d->type == OBJTYPE_DERIVED )
   {
       DerivedObject * alias = (DerivedObject *)d;
       ++ alias->foo;
   }
}

...
/* somewhere in code */
BaseObject b;

b.type = OBJTYPE_UNDEFINED;
incFoo( &b ); /* crash? */

/* ... */
DerivedObject d;

d.type = OBJTYPE_DERIVED;
d.foo = 0;
incFoo( (BaseObject *)&d ); /* crash? */


Если да, то мать-перемать, что ж я натворил
Re[2]: Умный вопрос по C/C++
От: gear nuke  
Дата: 04.04.08 14:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Недостатки аппаратуры выдавать за стандарт это не просто глупость.


Например, если так делать для double, даже на x86 можно получить исключение.
Требование обосновано Representations of types

§6.2.6.1/5 Certain object representations need not represent a value of the object type. If the stored
value of an object has such a representation and is read by an lvalue expression that does
not have character type, the behavior is undefined. If such a representation is produced
by a side effect that modifies all or any part of the object by an lvalue expression that
does not have character type, the behavior is undefined.41) Such a representation is called
a trap representation.

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Умный вопрос по C/C++
От: skeptik_  
Дата: 04.04.08 14:10
Оценка:
Здравствуйте, Андрей Коростелев, Вы писали:

АК>Правило введенное в С99 и запрещающее создание алиаса объекта с типом отличного от типа объекта-оригинала (ISO/IEC 9899 6.5/7) поддерживается в gcc 3.4.1 и выше на уровнях оптимизации начиная со 2-го. В данном случе sp не будет являться корректным алиасом для объекта *arg, потому компилятор вправе сгенерировать код, при котором sp не указывает на &(*arg).


Пардон, а что тут нового? Точно такой же текст стоит в С90 6.3. Если речь об этом, конечно:

7 An object shall have its stored value accessed only by an lvalue expression that has one of the following types:
— a type compatible with the effective type of the object,
— a qualified version of a type compatible with the effective type of the object,
— a type that is the signed or unsigned type corresponding to the effective type of the object,
— a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,
— an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or
— a character type.

Re[2]: Умный вопрос по C/C++
От: Erop Россия  
Дата: 04.04.08 14:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если да, то мать-перемать, что ж я натворил

Пока твои структуры останутся POD гарантируется, что этот код будет работать правильно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Умный вопрос по C/C++
От: Аноним  
Дата: 04.04.08 19:11
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, <Аноним>, Вы писали:


А>>Недостатки аппаратуры выдавать за стандарт это не просто глупость.


GN>Например, если так делать для double, даже на x86 можно получить исключение.

??? правда
volatile double x=1.0;
char* p=(char*)&x;

Теперь по новым стандартам это бред? И я даже не смогу проверить как оно лежит в памяти?

GN>Требование обосновано Representations of types


GN>

§6.2.6.1/5 Certain object representations need not represent a value of the object type. If the stored
GN>value of an object has such a representation and is read by an lvalue expression that does
GN>not have character type, the behavior is undefined. If such a representation is produced
GN>by a side effect that modifies all or any part of the object by an lvalue expression that
GN>does not have character type, the behavior is undefined.41) Such a representation is called
GN>a trap representation.

Пусть они себе такое обоснование засунут куда-нибуть.
Нет чтоб определить "representations of Certain object", так они делают детские грабли, с топором на конце.
И пусть они свои фантазии называют как угодно. Я определил в программе как оно лежит в памяти.
И меня не чешут их филосовские изыскания что на какой то другой машине это будет представлено иначе, мне это нужно для конкретной.
Может я просто хочу выяснить как оно в памяти лежит, а меня тут наглым образом начинает разводить компилятор. Повбивалбы.

Радует только одно что такие стандарты нарушают совместимость с предыдущими версиями. И старый код скорее всего может не работать. Что в свою очередь приведет к тому что на такой стандарт пользователи положут болт.
Re[4]: Умный вопрос по C/C++
От: Roman Odaisky Украина  
Дата: 04.04.08 21:19
Оценка:
Здравствуйте, Аноним, Вы писали:

GN>>Например, если так делать для double, даже на x86 можно получить исключение.

А>??? правда
А>
А>volatile double x=1.0;
А>char* p=(char*)&x;
А>

А>Теперь по новым стандартам это бред? :no: И я даже не смогу проверить как оно лежит в памяти? :???:

Это будет работать (можно кастить к char * и void *). Не обязано работать (double *)someRandomCharArray.

А лезть в байты тебе ни к чему, разные платформы будут иметь разные представления double.

Да и стандарт 1998 г. в. как-то не очень похож на новый.
До последнего не верил в пирамиду Лебедева.
Re[5]: Умный вопрос по C/C++
От: Аноним  
Дата: 04.04.08 21:38
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Аноним, Вы писали:


GN>>>Например, если так делать для double, даже на x86 можно получить исключение.

А>>??? правда
А>>
А>>volatile double x=1.0;
А>>char* p=(char*)&x;
А>>

А>>Теперь по новым стандартам это бред? И я даже не смогу проверить как оно лежит в памяти?

RO>Это будет работать (можно кастить к char * и void *). Не обязано работать (double *)someRandomCharArray.

RO>А лезть в байты тебе ни к чему, разные платформы будут иметь разные представления double.
И как я по вашему тогда вынужден буду делать эмуляцию чисел с плавающей точкой. Если компилятор мне строит препятствия на ровном месте?
И потом для разных платформ и api разное и abi да и компиляторы у одних 48бит аккумулятор, у других операции векторные (сразу пачками обрабатывает), одни RISC другие CISC, одни DSP а другие только целочисленно умножать умеют. Даже POSIX у всех свой. Короче у меня есть разная реализация под разные платформы и неипёт.
Я хочу сказать что такие синтетические ограничения это полный маразм. Мне пофиг как оно устроено на разных платформах которые я не использую.
Мне важен факт что один и тот же компилятор на одной и той же платформе обманывает и генерит ерись. Причем проблема совершенно надуманная и искуственная!
Если arm работает со словами а не с байтами. Какого я должен над этим суетиться, а не компилятор? Если процессор не умеет что то делать, то почему я что дожен это делать за компилятор?
Задача компилятора облегчить написание программ, а тут всё наоборот. (И мы еще боримся за звание дома высокой культуры быта)

RO>Да и стандарт 1998 г. в. как-то не очень похож на новый.

А там то что не так?
Re[4]: Умный вопрос по C/C++
От: gear nuke  
Дата: 05.04.08 00:49
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>
А>volatile double x=1.0;
А>char* p=(char*)&x;
А>

А>Теперь по новым стандартам это бред? И я даже не смогу проверить как оно лежит в памяти?

Так можно, я же привёл цитату

GN>>

If the stored value of an object has such a representation and is read by an lvalue expression that does not have character type, the behavior is undefined.


Проблемы могут быть, если последовательность char, представляющую собой репрезентацию NaN, прочитать в duoble. В место "неожданного" результата, как в оригинальном примере, будет сгенереировано исключение (хотя по умолчанию оно замаскировано) — это на самой распростанённой платформе, а с другими может быть еще хуже.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Умный вопрос по C/C++
От: Аноним  
Дата: 05.04.08 08:25
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Проблемы могут быть, если последовательность char, представляющую собой репрезентацию NaN, прочитать в double. В место "неожданного" результата, как в оригинальном примере, будет сгенереировано исключение (хотя по умолчанию оно замаскировано) — это на самой распростанённой платформе, а с другими может быть еще хуже.

И что NaN этот тоже последовательность бит в памяти. В чем проблема то? Где будет хуже? Что нафиг за цензура еще такая?
Re[6]: Умный вопрос по C/C++
От: Erop Россия  
Дата: 06.04.08 13:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В чем проблема то?

В системе команд CPU
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Умный вопрос по C/C++
От: Аноним  
Дата: 06.04.08 20:55
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


А>>В чем проблема то?

E>В системе команд CPU
Система команд CPU. Как раз проблема разработчиков компилятора, а не того кто пишет на C/C++
Re[8]: Умный вопрос по C/C++
От: Erop Россия  
Дата: 06.04.08 23:16
Оценка:
Здравствуйте, Аноним, Вы писали:

E>>В системе команд CPU

А>Система команд CPU. Как раз проблема разработчиков компилятора, а не того кто пишет на C/C++
Ну фокус в том, что то, что нельзя сделать на асме, то и на С++ нельзя тем более. Так что у авторов компиляторов нет проблем. Проблемы есть у проектировщиков ПО, которые хотят сделать то, что аппаратура не очень умеет и не особо должна к тому же

На всякий случай. К char* приводить можно любой указатель и потом по байтам читать память. Это для тех, кто эмуляторы писать хочет очень даже удобно. А для тех, кто хочет то эмуляторы, а то FPU попользоваться ждёт сюрприз в виде того, что даже и не FPU данные иногда в регистры поднимаются, например. И не все состяния процессора и регистров отображаются в биты в памяти при этом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Умный вопрос по C/C++
От: Аноним  
Дата: 07.04.08 10:44
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>>>В системе команд CPU

А>>Система команд CPU. Как раз проблема разработчиков компилятора, а не того кто пишет на C/C++
E>Ну фокус в том, что то, что нельзя сделать на асме, то и на С++ нельзя тем более.
Категорически не согласен, если это не специализированный чип, то на асме можно сделать всё что угодно. И эффективность реализации тут совершенно не важна.

E>Так что у авторов компиляторов нет проблем. Проблемы есть у проектировщиков ПО, которые хотят сделать то, что аппаратура не очень умеет и не особо должна к тому же

Вот именно что они свои проблемы с себя скидывают на других, при этом еще и в стандарт наравят засунуть что бы было чем оправдываться. А так как стандарт святое для не которых, они тупо молятся на такой бред. И готовы до усеру убеждать остальных что это единственно возможный и верный путь.

E>На всякий случай. К char* приводить можно любой указатель и потом по байтам читать память. Это для тех, кто эмуляторы писать хочет очень даже удобно. А для тех, кто хочет то эмуляторы, а то FPU попользоваться ждёт сюрприз в виде того, что даже и не FPU данные иногда в регистры поднимаются, например. И не все состяния процессора и регистров отображаются в биты в памяти при этом...

Вот очень странно если у меня N чисел (сотни и миллионы) с плавающей точкой, то как процессор может их держать у себя в регистрах? Если регистров у него значительно меньше. Мне совершенно не важна внутренняя разрядность и архитектура математического сопроцессора. Но когда он числа сохраняет в память он это делает вполне детерминированно.
Все эти сюрпризы должны решаться и обходиться именно теми кто делает компилятор под эту платформу, а не тем кто пишет кроссплатформенное приложение, а потом выясняется что на этой архитектуре, что бы работало надо знать множество заклинаний и шаманских обрядов, а также досконально знать что именно данный процессор может и как и что компилятор делает не так как все, а по своему.
Re[10]: Умный вопрос по C/C++
От: Erop Россия  
Дата: 07.04.08 10:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Категорически не согласен, если это не специализированный чип, то на асме можно сделать всё что угодно. И эффективность реализации тут совершенно не важна.

Да? Ну вычисли точно число пи, например...

А>Вот именно что они свои проблемы с себя скидывают на других, при этом еще и в стандарт наравят засунуть что бы было чем оправдываться. А так как стандарт святое для не которых, они тупо молятся на такой бред. И готовы до усеру убеждать остальных что это единственно возможный и верный путь.

Проектировщики ПО? Да хотят... Вот ты, например, хотешь, вроде бы того, чтобы авторы компиляторов эмулировали какое-то нужное тебе поведение...

А>Вот очень странно если у меня N чисел (сотни и миллионы) с плавающей точкой, то как процессор может их держать у себя в регистрах? Если регистров у него значительно меньше. Мне совершенно не важна внутренняя разрядность и архитектура математического сопроцессора. Но когда он числа сохраняет в память он это делает вполне детерминированно.

Даже числа не всегда, но у процессора, кроме чисел, есть ещё и состояние. Состояния он сохранять в память вообще-то не обязан... Скажем такое вот состояние "результат последней операции неотрицателен". Как ты собираешься в формате числа прихранивать?

А>Все эти сюрпризы должны решаться и обходиться именно теми кто делает компилятор под эту платформу, а не тем кто пишет кроссплатформенное приложение, а потом выясняется что на этой архитектуре, что бы работало надо знать множество заклинаний и шаманских обрядов, а также досконально знать что именно данный процессор может и как и что компилятор делает не так как все, а по своему.


Ну некоторым людям (скажу по секрету, их большинстово) нужна быстрая и эффективная работа приложений, а не эмуляция поведения одного железа на другом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.