Не столько ответ, сколько комментарий, который стал слишком большим:
Я думаю, это будет зависеть от того, сколько безопасности вы готовы обменять на скорость / простоту использования.В случае, если у вас есть struct
, как это:
struct S { char c; double d; };
Вы должны учитывать заполнение и тот факт, что некоторые архитектуры могут не позволить вам получить доступ к double
, если он не выровнен по правильномуадрес памяти.Добавление функций доступа и исправление отступов решают эту проблему, и структура по-прежнему memcpy
-поглощаема, но теперь мы входим на территорию, где на самом деле мы не получаем большой выгоды от использования файла отображения памяти.
Так как кажется, что вы будете использовать это только локально и в фиксированной настройке, ослабление требований кажется немного нормальным, поэтому мы вернулись к использованию выше struct
в обычном режиме.Теперь функция должна быть тривиально копируемой?Я не обязательно так думаю, рассмотрите этот (возможно, неработающий) класс:
1 #include <iostream>
2 #include <utility>
3
4 enum Endian { LittleEndian, BigEndian };
5 template<typename T, Endian e> struct PV {
6 union {
7 unsigned char b[sizeof(T)];
8 T x;
9 } val;
10
11 template<Endian oe> PV& operator=(const PV<T,oe>& rhs) {
12 val.x = rhs.val.x;
13 if (e != oe) {
14 for(size_t b = 0; b < sizeof(T) / 2; b++) {
15 std::swap(val.b[sizeof(T)-1-b], val.b[b]);
16 }
17 }
18 return *this;
19 }
20 };
Это не просто копировать, и вы не можете просто использовать memcpy
, чтобы переместить его в целом, но я неС использованием подобного класса в контексте отображенного в памяти файла не может быть ничего неправильного (особенно если файл не соответствует собственному порядку байтов).
Обновление:
Где вы рисуетестрока?
Я думаю, что приличное практическое правило таково: если эквивалентный код C приемлем и C ++ просто используется для удобства, для обеспечения безопасности типов или надлежащего доступа, это должно бытьхорошо.
Это сделало бы boost::interprocess::offset_ptr
ОК, поскольку это просто полезная оболочка для ptrdiff_t
со специальными семантическими правилами.В том же духе struct PV
выше было бы нормально, так как он просто предназначен для автоматической перестановки байтов, хотя, как и в C, вы должны быть осторожны, чтобы отслеживать порядок байтов и предполагать, что структура может быть просто скопирована.Виртуальные функции не будут в порядке, так как эквивалент C, указатели функций в структуре, не будет работать.Однако что-то вроде следующего (непроверенного) кода снова будет в порядке:
struct Foo {
unsigned char obj_type;
void vfunc1(int arg0) { vtables[obj_type].vfunc1(this, arg0); }
};