2012-03-06 3 views
5

Где в стандарте C++ говорится об псевдониме? Я посмотрел на Ток и не заметил упоминания слова «псевдоним». Я попытался посмотреть в одном правиле определения (3.2), и поиск «псевдонима» не имел результатов. Я не понимаю, где это может быть. Я ищу память наложения спектровГде стандартный разговор об псевдониме?

+1

Не могли бы вы быть более конкретными? Есть как минимум две вещи, на которые можно ссылаться с помощью «aliasing» - псевдонимов пространства имен и сглаживания данных в памяти через структуры/объединения/перекрывающиеся массивы. – dasblinkenlight

+0

@dasblinkenlight: Исправлено. Алиасирование данных/памяти –

ответ

10

Aliasing в основном обсуждаются в §3.10 [basic.lval]/10:

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

  • динамического типа объекта,
  • вольтамперных квалифицированных вариант динамического типа объекта,
  • типа похожи (как это определено в 4.4) с динамическим типом объекта,
  • тип, который является знаком или без знака типа, соответствующего динамического типа объекта,
  • тип, который подписанный или неподписанным типом, соответствующим соответствующей версии с открытым кодом динамического типа объекта,
  • тип агрегата или объединения, который включает один из вышеупомянутых типов среди его элементов или нестационарные элементы данных (включая, рекурсивно, элемент или нестатический элемент данных суммирования или содержащий объединение),
  • тип, который представляет собой тип базового класса (возможно, с квалификацией) для динамического типа объекта,
  • a char или unsigned char.

52) Цель этого списка указать те обстоятельства, в которых объект может или не может быть псевдонимами.

Так, например,

int x = 1; 
*(char*)(&x);  // (implementation-)defined 
*(unsigned*)(&x); // (implementation-)defined 
*(float*)(&x); // undefined 

Ниже упоминаются также может быть интересно.

§5.17 [expr.ass]/8

Если значение хранится в объекте доступен из другого объекта, который перекрывается каким-либо образом хранение первый объект, то перекрытие должно быть точные и два объекта должны иметь один и тот же тип, иначе поведение не определено. [Примечание: Это ограничение относится к взаимосвязи между левой и правой сторонами операции назначения; это не утверждение о том, как цель присвоения может быть псевдонимом в вообще. См. 3.10. - примечание к концу]

§17.6.4.9 [res.on.аргументы]/1 пт 3:

Если аргумент функции связывается с опорным параметром RValue, реализация может предположить, что этого параметром является уникальной ссылкой на этот аргумент. ... [ реализация свободна оптимизировать далеко альясинг проверки, которые могут быть необходимы, если аргумент был именующим.]

§26.6.2 [valarray.syn]/2:

valarray классы классов определены как свободные от определенных форм сглаживания, что позволяет оптимизировать эти классы на .

и остальная часть <valarray> также обсуждают, как класс должен быть реализован во избежание сглаживания данных.

Смежные вопросы