Результаты поиска по запросу "strict-aliasing"

2 ответа

Это действительно нарушает правила строгого наложения имен?

Когда я компилирую этот пример кода, используя g ++, я получаю это предупреждение:предупреждение: разыменование указателя типа-наказание нарушит правила стро...

3 ответа

(Как пояснение, объект, как правило, перестает существовать при отсутствии каких-либо существующих ссылок или указателей, которые когда-либо будут использоваться для доступа к нему или получения других указателей / объектов, которые будут использоваться таким образом). Основная причина, по которой существуют правила «псевдонимов», заключается в том, чтобы указывать, когда компиляторам необходимо делать допуски для ссылок, которые неожиданно идентифицируют тот же объект, но не требуются допуски в случаях, когда хранилище не изменено, и объект, который явно получен из другого, может вряд ли можно сказать «неожиданно» псевдоним это в контексте такого происхождения.

родолжение этого другоговопрос [https://stackoverflow.com/q/51930334/3545273]о повторном использовании памяти. Поскольку первоначальный вопрос касался конкретной реализации, ответ был связан с этой конкретной реализацией. Поэтому мне интересно, ...

7 ответов

Как правильно набирать поплавок для типа int и наоборот?

Код ниже выполняет быструю операцию обратного квадратного корня с помощью некоторых битовых хаков. Алгоритм, вероятно, был разработан Silicon Graphics в начале 1990-х годов и появился в Quake 3.больше ...

ТОП публикаций

4 ответа

Нарушает ли это приведение указателей строгое правило наложения имен?

Это быстрая реализация с обратным квадратным корнем из Quake III Arena: float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level ...

1 ответ

Это расположение памяти и информирование компилятора. Компилятор может выбрать размещение структуры по выровненному адресу, но это не обязательно будет делать, если структура заменяется всеми содержащимися в ней элементами. Может быть разница в байтах заполнения.

я есть структура X, которая наследует от структуры Base. Тем не менее, в моей текущей настройке, из-за выравнивания, размер X равен 24B: typedef struct { double_t a; int8_t b; } Base; typedef struct { Base base; int8_t c; } X;Чтобы сохранить ...

7 ответов

GCC, строгое псевдонимы и приведение через союз

У вас есть какие-нибудь страшные истории, чтобы рассказать? Руководство GCC недавно добавило предупреждение о -fstrict-aliasing и приведении указателя через ...

3 ответа

Допустимо ли псевдоним массива char через указатель на int?

Я знаю, что в стандарте явно разрешено следующее:

1 ответ

 объяснение. Я также добавил ссылку, подтверждающую ваше требование.

ец кода: struct S { int x; }; int func() { S s{2}; return (int &)s; // Equivalent to *reinterpret_cast<int *>(&s) }Я считаю, что это распространено и считается приемлемым. Стандарт гарантирует, что в структуре нет начального заполнения. Однако ...

3 ответа

Почему оптимизация убивает эту функцию?

Недавно в университете мы читали лекцию о специальностях программирования на нескольких языках. Лектор записал следующую функцию: inline u64 Swap_64(u64 x) { u64 tmp; (*(u32*)&tmp) = Swap_32(*(((u32*)&x)+1)); (*(((u32*)&tmp)+1)) = ...

3 ответа

@ M.M: Стандарт не признает разницу между непосредственным использованием агрегатного элемента и использованием его адреса и его использованием, а также в правилах псевдонимов не проводится различие между структурами и объединениями. Вместо этого поддержка практически любого вида доступа членов является проблемой качества реализации. Так получилось, что существующие версии gcc и clang поддерживают более гибкую семантику с указателями на элементы структуры, чем с lvalues ​​доступа к struct-member, но менее гибкую семантику с указателями на члены union, чем lvalues ​​для доступа union-member.

ми определениями: struct My_Header { uintptr_t bits; } struct Foo_Type { struct My_Header header; int x; } struct Foo_Type *foo = ...; struct Bar_Type { struct My_Header header; float x; } struct Bar_Type *bar = ...;Правильно ли говорить, что ...