Вы отказались от использования long
в качестве 32-битного типа данных ... что, по крайней мере, в системах UN * X, не относится к 64-битным (модель данных LP64, int
- 32-битная, но * 1003) * и 64-битные указатели).
В Windows64 (модель данных IL32P64, int
и long
32-битная, но указатели 64-битные) ваш код, выполняющий вычисления размера в единицах sizeof(long)
и непосредственно выполняющий memcpy()
из сопоставленного файла в объектно-ориентированный массив, будет на самом деле продолжать работать ...
В UN * X это означает, что при переходе на 64-битную версию, чтобы сохранить переносимость кода, было бы лучше переключиться на int32_t с явно заданным размером (с <stdint.h>
), чтобы убедиться, что структура вашей структуры данных остается неизменным при выполнении как 32-битных, так и 64-битных целевых компиляций.
Если вы настаиваете на сохранении long
, то вам придется изменить интернализацию / экстернализацию массива с простого memcpy()
/ write()
на другие действия. Без обработки ошибок (у вас это уже было выше) для метода ::fsave()
это выглядело бы так, вместо использования write()
, как вы делаете:
long *array = this->values;
int32_t *filebase =
mmap(NULL, file_status.st_size, PROT_WRITE, MAP_SHARED, fd, offset);
for (int i = 0; i < this->_size; i++) {
if (array[i] > INT32_MAX || array[i] < INT32_MIN)
throw (std::bad_cast); // can't do ...
filebase[i] = static_cast<int32_t>(array[i]);
}
munmap(filebase, file_status.st_size);
и для ::fload()
вместо memcpy()
вы должны сделать следующее:
long *array = this->values;
int32_t *filebase =
mmap(NULL, file_status.st_size, PROT_READ MAP_SHARED, fd, offset);
for (int i = 0; i < this->_size; i++)
array[i] = filebase[i];
munmap(filebase, file_status.st_size);
Примечание. Как уже упоминалось, этот подход не будет работать, если у вас есть что-то более сложное, чем простой массив, потому что, кроме различий в размерах типов данных, могут быть и другие ограничения выравнивания, и другие правила заполнения. Кажется, что это не так, поэтому имейте это в виду, только когда рассматриваете возможность расширения этого механизма (не используйте проверенную библиотеку, такую как boost :: any или Qt :: Variant, которая может экстернализовать / усвоить).