Можно ли сделать двойной массив структурой, состоящей из двухместных?Листинг двойного массива для структуры удвоений
struct A
{
double x;
double y;
double z;
};
int main (int argc , char ** argv)
{
double arr[3] = {1.0,2.0,3.0};
A* a = static_cast<A*>(static_cast<void*>(arr));
std::cout << a->x << " " << a->y << " " << a->z << "\n";
}
Отпечатано 1 2 3
. Но гарантированно ли он работать каждый раз с любым компилятором?
EDIT: В соответствии с
9.2.21: указатель на объект структуры стандартной компоновки, соответствующим образом преобразованы? используя reinterpret_cast, указывает на его начальный член (...) и наоборот.
, если я заменю мой код с
struct A
{
double & x() { return data[0]; }
double & y() { return data[1]; }
double & z() { return data[2]; }
private:
double data[3];
};
int main (int, char **)
{
double arr[3] = {1.0,2.0,3.0};
A* a = reinterpret_cast<A*>(arr);
std::cout << a->x() << " " << a->y() << " " << a->z() << "\n";
}
тогда гарантированно работать. Верный? Я понимаю, что многие люди не считают эту эстетику приятной, но есть преимущества в работе со структурой и не нужно копировать данные входных массивов. Я могу определить функции-члены в этой структуре для вычисления скалярных и векторных продуктов, расстояний и т. Д., Что сделает мой код намного понятнее, чем если бы я работал с массивами.
Как насчет
int main (int, char **)
{
double arr[6] = {1.0,2.0,3.0,4.0,5.0,6.0};
A* a = reinterpret_cast<A*>(arr);
std::cout << a[0].x() << " " << a[0].y() << " " << a[0].z() << "\n";
std::cout << a[1].x() << " " << a[1].y() << " " << a[1].z() << "\n";
}
Это также гарантирует работу или компилятор может поставить что-то после того, как члены данных так, что sizeof(A) > 3*sizeof(double)
? И есть ли какой-либо переносной способ предотвратить компилятор?
Любой может написать компилятор, так что это сложный вопрос. Почему бы не указать компиляторы, которые вы собираетесь использовать? Я предполагаю, что все основные компиляторы справляются с этим одинаково, и это действительно работает. –
Скорее всего, нет (в случае, если вы хотите использовать не только двойной там), из-за [выравнивания структуры данных] (https://en.wikipedia.org/wiki/Data_structure_alignment) –
Вы нарушаете строгое правило сглаживания. – Jarod42