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

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

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

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

4 ответа

Решение

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

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

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

std::complex array [COUNT];

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

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

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

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

ofstream file("somefile.txt");

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

Или же

file << complex_var << "\n";

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

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

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

Другие вопросы по тегам