Суть вопроса: функция принимает в качестве аргумента указатель на float (массив float'ов). У меня вместо массива float'ов, массив векторов т.е.
struct mhVec3f
{
float x, y, z;
}
const int n = 10;
mhVec3f v[n];
Если я приведу тип (float*)v, то в функцию попадёт указатель на sizeof(float)*3*n или ещё что-то?
Другие языки программирования и технологии
С++ приведение типов
>если размер структуры равен 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. Стандарт языка не зря придумали.
В том-то и дело что если 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. Стандарт языка не зря придумали.
По большому счету, место переменной в памяти неопределено. В C++11 специально введены ключевые слова alignas/alignof для того, чтобы решить эти проблемы.
Но в данном случае, если не включать совсем уж маньяческую оптимизацию, все должно быть просто: в функцию попадает указатель на массив флоатов размером 3*n, т. е. то, что ты, видимо, и имел в виду.
Но в данном случае, если не включать совсем уж маньяческую оптимизацию, все должно быть просто: в функцию попадает указатель на массив флоатов размером 3*n, т. е. то, что ты, видимо, и имел в виду.
По идее, указатель по-прежнему будет указывать на начало массива, а вот величина элемента, на который он указывает, будет считаться размером float.
Правда, в C++ все необычное надо проверять, это язык чародеев и фокусников ;).
Правда, в C++ все необычное надо проверять, это язык чародеев и фокусников ;).
Скорее всего да, если размер структуры равен 12-ти. Точнее, не скорее всего, а точно.
Похожие вопросы
- Автоматическое приведение типов (вопрос по С++)
- Приведение всех телефонов к международному формату +7 xxx xxx-xx-xx в Excel
- Тип данных в паскале
- Несколько вопросов про преобразование типов в С++ и возможно не только.
- C++17 Чтение вектора элементов типа any
- Инициализация массива символьного типа. С++
- помогите поменять тип файла
- Что имеется ввиду под 4 байтами у типа данных int?(С++)
- Вопрос про типы данных
- Про типы данных.