【发布时间】:2022-01-01 14:25:53
【问题描述】:
我正在构建一个将在类中使用的缓冲区,并想知道根据 C++ 标准以下内容是否有效:
#include <iostream>
#include <cstdint>
int main() {
alignas(std::int32_t) char A[sizeof(std::int32_t)] = { 1, 0, 0, 0 };
std::int32_t* pA = new (&A) std::int32_t;
std::cout << *pA << std::endl;
return 0;
}
缓冲区已初始化为 4 字节的 char 数组。在结构顶部放置一个新位置是否允许我以int32_t 的形式访问下面的位?我现在可以以 4 个chars(通过buffer 对象)或 1 个int32_t(通过pA)访问内存空间而不违反标准吗?如果不行,有没有其他办法?
注意:是的,我知道字节序,但在这种情况下,字节序无关紧要。那是一个不同的讨论。
【问题讨论】:
-
不,现在你不能直接访问
A(它的生命周期已经结束)并且读取*pA会读取一个未初始化的int,这也是未定义的行为。 -
@FrançoisAndrieux,有没有办法让编译器将其视为已初始化?必须有,因为一直有从文件和流中读取的缓冲区。
-
不,你不能。像这样的内置类型无法共享相同的内存表示并同时可访问。
-
memcpy是诀窍。 -
使用 std::bit_cast 进行类型双关。
标签: c++ placement-new