有一段时间了,我正在阅读有关对齐、别名、填充和放置新的文档,但我仍然不确定如何解决这个问题——这是我第一次在这个级别上遇到内存问题,所以我我不自信。
问题是:我有一个缓冲区,一个数据数组,它使用某种类型typeT
,例如
typeT buff[N];
在该缓冲区内,我必须typeU
在buff
. 让我们假设有 的K
元素typeU
,它小于或等于M
类型的元素typeT
。
编辑:这个问题取决于数据类型,但我的问题是通用的,适用于 POD 和非 POD。但是您可以假设非 POD 只是 POD 类型的聚合,没有要复制的动态内存,并且所有数据都包含在sizeof(typeX)
结构本身的字节中。也就是说,不用担心深/浅复制。
我最感兴趣的情况typeT
是typeU
不同的对齐方式。哪个对齐大小更大尚不清楚。
问题 1:(最重要的问题)考虑到我将始终使用 typeU 访问这些数据,就像在下面的代码中一样,使用新位置存储我的数据是否总是安全的?buff
typeU *allocData = new (buff) typeU[K];
allocData[0] = foo;
问题 2 :从using类型的缓冲区中复制任何数据是否总是安全的,因为我将始终使用 访问数据,就像在下面的代码中一样?typeU*
typeT*
memcpy
typeU*
typeU prevData[K];
memcpy(buff, prevData, sizeof(typeU) * K);
// Is it safe to do the following?
typeU *accessData = reinterpret_cast<typeU *>(buff);
accessData[1] = foo;
问题 3:(最不重要的问题)只是转换指针并使用它们写入数据并不总是安全的吗?像
typeU *castData = (typeU*)buff;
castData[2] = something;
即使我总是使用内存的第一个区域(前 M 个元素)使用typeU
和第二个区域(从 M 到 N 的元素)使用typeT
?
我希望我的意思很清楚......我搜索了很多,但我仍然很困惑。
另外,请考虑我说的是 C++98 或 03,而不是 11,它具有 STL 的最小子集,没有提升,并不总是在 x86 上 - 但我可以使用 memcpy 和 Placement new,正如我所说。