Хранится ли std :: complex с чередованием? - PullRequest
3 голосов
/ 15 марта 2011

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

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

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

Ответы [ 4 ]

2 голосов
/ 16 марта 2011

Массив std :: complex определяется следующим образом:

std :: complex array [COUNT];

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

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

2 голосов
/ 15 марта 2011

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

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

1 голос
/ 15 марта 2011

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

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

1 голос
/ 15 марта 2011

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

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

ofstream file("somefile.txt");

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

Или

file << complex_var << "\n";

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

...