LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

верно ли предположение о том, что можно кастовать в указатель любого типа и отправлять в функцию без опасений?верно ли предположение о том, что можно кастовать в указатель любого типа и отправлять в функцию без опасений?

Во-первых если у тебя функция принимает указатель на char и указатель на int например, то компилятор в соответствии со strict aliasing решит что эти указатели не могут указывать на одну и ту же область памяти, и заоптимизирует(может заоптимизировать) это соответствующим образом, так что опасения все же нужны.

Во-вторых указатели на большие типы должны быть выравнены по определенным границам, и если ты например делаешь char a[5] = {1,2,3,4,5}; uint32_t *ptr = (uint32_t *)&a[1]; то это будет UB. http://spin.atomicobject.com/2014/05/19/c-undefined-behaviors/ см второй пункт. Это про C, но к плюсам думаю тоже относится.

Исправление SZT, :

верно ли предположение о том, что можно кастовать в указатель любого типа и отправлять в функцию без опасений?верно ли предположение о том, что можно кастовать в указатель любого типа и отправлять в функцию без опасений?

Во-первых если у тебя функция принимает указатель на char и указатель на int например, то компилятор в соответствии со strict aliasing решит что эти указатели не могут указывать на одну и ту же область памяти, и заоптимизирует(может заоптимизировать) это соответствующим образом, так что опасения все же нужны.

Во-вторых указатели на большие типы должны быть выравнены по определенным границам, и если ты например делаешь char a[5] = {1,2,3,4,5}; uint32_t *ptr = &a[1]; то это будет UB. http://spin.atomicobject.com/2014/05/19/c-undefined-behaviors/ см второй пункт. Это про C, но к плюсам думаю тоже относится.

Исходная версия SZT, :

верно ли предположение о том, что можно кастовать в указатель любого типа и отправлять в функцию без опасений?верно ли предположение о том, что можно кастовать в указатель любого типа и отправлять в функцию без опасений?

Во-первых если у тебя функция принимает указатель на char и указатель на int например, то компилятор в соответствии со strict aliasing решит что эти указатели не могут указывать на одну и ту же область памяти, и заоптимизирует это соответствующим образом, так что опасения все же нужны.

Во-вторых указатели на большие типы должны быть выравнены по определенным границам, и если ты например делаешь char a[5] = {1,2,3,4,5}; uint32_t *ptr = &a[1]; то это будет UB. http://spin.atomicobject.com/2014/05/19/c-undefined-behaviors/ см второй пункт. Это про C, но к плюсам думаю тоже относится.