Другие языки программирования и технологии

С++ приведение типов

Суть вопроса: функция принимает в качестве аргумента указатель на float (массив float'ов). У меня вместо массива float'ов, массив векторов т.е.

struct mhVec3f
{
float x, y, z;
}

const int n = 10;
mhVec3f v[n];

Если я приведу тип (float*)v, то в функцию попадёт указатель на sizeof(float)*3*n или ещё что-то?
Олег Нечёсов
Олег Нечёсов
9 740
>если размер структуры равен 12-ти
В том-то и дело что если 12(точнее sizeof(float)*3), а если не 12? Компилятор запросто может выравнить структуры по 8/16/etc. байт, тогда массив структур, приведенный к float* будет содержать внутри себя "дыры" для выравнивания.
Что и написано в стандарте:
A pointer to a POD-struct object, suitably converted using a reinterpret_cast, points to its initial
member (or if that member is a bit-field, then to the unit in which it resides) and vice versa. [Note: There
might therefore be unnamed padding within a POD-struct object, but not at its beginning, as necessary to
achieve appropriate alignment. ]

>Правда, в C++ все необычное надо проверять, это язык чародеев и фокусников ;).
Если у тебя это сработает на компиляторе A и платформе B, то это не значит, что такой же результат будет на C и D. Стандарт языка не зря придумали.
Александр Фабричнин
Александр Фабричнин
5 079
Лучший ответ
По большому счету, место переменной в памяти неопределено. В C++11 специально введены ключевые слова alignas/alignof для того, чтобы решить эти проблемы.
Но в данном случае, если не включать совсем уж маньяческую оптимизацию, все должно быть просто: в функцию попадает указатель на массив флоатов размером 3*n, т. е. то, что ты, видимо, и имел в виду.
Андрей Петров
Андрей Петров
74 341
По идее, указатель по-прежнему будет указывать на начало массива, а вот величина элемента, на который он указывает, будет считаться размером float.
Правда, в C++ все необычное надо проверять, это язык чародеев и фокусников ;).
Макс Ослин
Макс Ослин
56 928
Скорее всего да, если размер структуры равен 12-ти. Точнее, не скорее всего, а точно.