Rom*_*dgz 4 c++ inheritance struct memcpy
我刚刚从这个Q/A中发现结构在C++中是可继承的,但它是一个好的实践,还是更适合使用类?哪种情况更可取,哪种情况不适合?
我从来没有需要这个,但现在我有一堆不同类型但经度相同的消息.我在char数组中使用二进制文件,我只是将它们与memcpy一起复制到结构中以填充其字段(我不知道是否甚至可以使用std :: copy).
我想能够使用公共头继承基础结构中的每个结构都很棒,这就是我搜索它的原因.所以第二个问题是:如果我用类做这个,是否可以从缓冲区到类中执行memcpy(或std:copy)?
是否可以使用按位复制与structor class标签无关,只取决于是否表示struct或class is_trivially_copiable.它们是否在标准(9/6 [class])中定义,它基本上归结为不必声明任何其他特殊成员方法而不是构造函数.
然后标准在3.9/2 [basic.types]中允许按位复制
对于具有普通可复制类型的任何对象(基类子对象除外)
T,无论对象是否保持有效的类型值,构成对象T的基础字节(1.7)都可以复制到char或的数组中unsigned char.如果阵列的内容char或unsigned char将被复制回对象,该对象随后应保持其原始值.[ 例如:Run Code Online (Sandbox Code Playgroud)#define N sizeof(T) char buf[N]; T obj; // obj initialized to its original value std::memcpy(buf, &obj, N); // between these two calls to std::memcpy, // `obj` might be modified std::memcpy(&obj, buf, N); // at this point, each subobject of `obj` // of scalar type holds its original value- 末端的例子 ]
注意:填充字节的按位副本将导致Valgrind中的报告.
使用std::copy相同的效果:
char const* b = reinterpret_cast<char const*>(&obj);
std::copy(b, b + N, buf);
Run Code Online (Sandbox Code Playgroud)