Хранится ли std::complex с чередованием?

То есть на диске, если у меня есть массив std::complex, он хранится RIRIRIRI или RRRRIIII или что-то еще?

Мой реальный вопрос: если у меня есть определенная мной структура, содержащая два числа, могу ли я выполнить переинтерпретацию массива моей структуры для использования функций, которые ожидают массив std::complex?

Как насчет memcpy? Если обе мои структуры являются плавающими, все должно быть в порядке, если они хранятся одинаково?


person Derek    schedule 15.03.2011    source источник
comment
Вы, вероятно, захотите взглянуть на этот вопрос: массив в c">stackoverflow.com/questions/5020076/   -  person Matteo Italia    schedule 15.03.2011
comment
Ответы на мой аналогичный вопрос могут представлять интерес: stackoverflow.com/questions/5060879/   -  person Tom    schedule 16.03.2011


Ответы (4)


Класс C++ — это не более чем struct с некоторыми украшениями. Таким образом, члены, определенные в классе, располагаются в памяти последовательно, непрерывно для каждого элемента этого типа. Другими словами, массив из std::complex, где каждый элемент содержит RI, будет храниться RIRIRIRI.

Вероятно, вам сойдет с рук reinterpret_cast, но вы будете зависеть от реализации std::complex, если вы это сделаете - и это, вероятно, будет очень хорошо.

person Heath Hunnicutt    schedule 15.03.2011
comment
Я думаю, вы имели в виду RRRRIIII. Все части действительного числа стоят перед всеми частями мнимого числа. При этом любое использование этого может привести к тому, что код не будет работать на некоторых платформах или с некоторыми компиляторами. - person Omnifarious; 15.03.2011
comment
Нет, RRRRIIII — неправильный ответ. В пределах одного std::complex действительное число стоит перед мнимым числом. Частей чисел нет. - person Heath Hunnicutt; 15.03.2011
comment
@Хит Ханникатт: О! К сожалению, я пропустил слово «массив» в OP. - person Omnifarious; 15.03.2011
comment
;) Кстати, на карте openhatch.org мы соседи. - person Heath Hunnicutt; 16.03.2011
comment
@ Хит Ханникатт: Так и есть. Интересно, откуда этот сайт берет данные. - person Omnifarious; 16.03.2011
comment
@Omnifarious: я не уверен насчет вашего, но в моем случае он получил данные, когда я вводил свой адрес. - person Heath Hunnicutt; 22.03.2011

Массив std::complex определен так:

std::complex array[COUNT];

... гарантированно хранится в памяти как RIRIRIRI по той причине, что array[i] по определению совпадает с i[array], то есть *(array+i). Если бы массив хранился как RRRRIIII, не было бы способа указать на отдельный элемент массива с помощью простого указателя.

Однако есть один случай на типичном современном ПК, где этот массив хранится как RRRRIIII: после того, как он скопирован в StructuredBuffer для GPU в Direct3D 11+. Вызов API, который копирует массив RIRIRIRI в GPU, может незаметно переупорядочить его как RRRRIIII, если это улучшит производительность GPU, что на практике и происходит.

person Community    schedule 16.03.2011

Это полностью зависит от того, как вы сохранили их в файле в первую очередь.

Вы могли бы сделать:

ofstream file("somefile.txt");

file << complex_var.real() << "\t" << complex_var.imag() << "\n";

Or

file << complex_var << "\n";

Последний сохранит его (в текстовом виде) как «(действительная часть, мнимая часть)». Если бы я писал в двоичном режиме, я бы не знал, но просто попытаться посмотреть, какой вывод будет сгенерирован, было бы простым (и, скорее всего, стандартизированным в данном случае) способом увидеть, что происходит.

person rubenvb    schedule 15.03.2011

Я не уверен, каково физическое значение массива класса на диске. Вы должны не просто записывать байты на диск, а использовать настоящую сериализацию. Тогда вы сами знаете представление.

Что касается других ваших вопросов, не делайте этого, даже если это работает (что может быть на данный момент). Просто создайте объекты std::complex из пар из вашего массива и обработайте эти объекты.

person Mark B    schedule 15.03.2011