блин, два здравых коммента во всём треде. этот и анонимуса.
куда катится мир? элементарные манипуляции с указателями вызывают какой-то нездоровый ажиотаж и конспирологические теории... как-то это печально совсем.
Не слушай тех, кто советует так и делать, в общем случае использование указателя не того и не совместимого по указателям типа, объект которого лежит по этому адресу - UB. Исключение в стандарте сделано только для char* - его можно приводить к указателю на что угодно.
Причина - компиляторам позволено строить свои оптимизации, исходя из предположения, что раз указатели не совсемстимых типов - значит они точно не указывают на одно и то же, а значит изменение значения по указателю A не может влиять на значение по указателю B
вы перед тем как бежать на форумы флудить, сначала бы книжки умные почитали. тут сверху прилеплена тема про всякие книжки по основам разных языков, в том числе С и С++. там на первых же страницах всё поясняется. про память, адресацию, указатели, выравнивание и вот это всё.
Мать, если тебе очень хочется отметиться в обсуждении, то вместо флуда и прокачки чсв ответила бы по существу. Что написано в книжках я без твоего совета знаю, но как показывает практика каждый такой начитанный поциент лепит как хочет, а потом вот так же, ковыряясь в сносу, рассказывает про «элементарные операции», ага
When a prvalue v of object pointer type is converted to the object pointer type “pointer to cv T”, the result is static_cast<cv T*>(static_cast<cv void*>(v)).
Да endianness какой угодно можно сделать. Если переформулировать вопрос, меня интересует, канает ли в обычной сишке strict aliasing rule и является ли оное говнокодом
ты своим вопросом показал, что не знаешь самых элементарных вещей. при этом назвав «наркоманией» абсолютно валидный и тривиальный код. наркоман - это ты. и я принципиально против ответов на такие вопросы, которые студент должен прочитать в самом начале изучения программирования. потому что иначе это просто флуд.
и я не хочу «отметиться» в таком «обсуждении». я хочу сказать, что два поста тут были по делу. остальное - бред и конспирология. и порождено это всё банальной неграмотностью.
Это не манипуляции с указателями это нарушение strict aliasing
что по сути — код с достаточно ясным намерением ломает тупой оптимизатор. Вот K&R этот код ничего не ломал, пока выполнялись условия по выравниванию (а на PDP за это били больно) и порядку следования (там были занятное endian, не big и не low, а именно pdp-endian), совсем недавно такого кода было вагон, начиная со всяких парсеров jpeg-ов и кончая FS и RPC. А теперь видите-ли нельзя, потому что оптимизатор может заалиасить память, но не обновить. Можно подумать, при перемещении порядка байт данные в них ломаются, а выравнивание — это такая случайная величина, которую предсказать никак нельзя...
Это отличная демонстрация эффекта «o tempora, o mores». Ибо когда это «починили» об анонимных структурах не подумали и родилось ЭТО: struct sockaddr_in { struct in_addr { in_addr_t s_addr; }; ... }
при этом назвав «наркоманией» абсолютно валидный и тривиальный код
И чем докажешь «абсолютную валидность»? Этот код нарушает strict aliasing rule. Ты же технически подкованный человек, выражайся конкретно, предъявляй пруфы. Но ты походу настолько безграмотна, что даже не почесалась от нарушения стандарта