C++ 在基元类型指针之间强制转换
是否定义了以下各项:C++ 在基元类型指针之间强制转换,c++,language-lawyer,strict-aliasing,C++,Language Lawyer,Strict Aliasing,是否定义了以下各项: char* charPtr = new char[42]; int* intPtr = (int*)charPtr; charPtr++; intPtr = (int*) charPtr; intPtr未正确对齐(两种情况中至少有一种)。仅仅在那里拥有它是违法的吗?它在任何阶段都在使用它吗?你怎么能使用它?你怎么不能?通常,如果int的对齐要求大于char的对齐要求,则结果是未指定的(5.2.10p7)。结果将是int*类型的有效值,因此可以首先使用运算符将其打印为指针
char* charPtr = new char[42];
int* intPtr = (int*)charPtr;
charPtr++;
intPtr = (int*) charPtr;
intPtr
未正确对齐(两种情况中至少有一种)。仅仅在那里拥有它是违法的吗?它在任何阶段都在使用它吗?你怎么能使用它?你怎么不能?通常,如果int
的对齐要求大于char
的对齐要求,则结果是未指定的(5.2.10p7)。结果将是int*
类型的有效值,因此可以首先使用运算符将其打印为指针,当然:指针保证在
第一种情况(根据§5.3.4/10和§3.7.4.1/2),可能正确
在这两种情况下保持一致。(显然,如果sizeof(int)==1,但是
即使不是这样,实现也不会
必须有对齐要求。)
为了让事情更清楚:你的演员阵容都是重新诠释的
除此之外,这是一个有趣的问题,因为
据我所知,这两个角色没有什么不同
有关标准。转换结果如下所示
未指定(根据§5.2.10/7);你甚至不能保证
将其转换回char*
将导致
原值。(例如,在机器上显然不会
其中int*
小于char*
)
当然,在实践中:标准要求返回
新字符[N]
的值应与任何值充分对齐
这可能适合它,因此保证您能够:
intPtr = new (charPtr) int;
考虑到
int
的默认构造函数是no-op。(假设
如果在此之后尝试使用intPtr
,则会发生(在相关处理器上)未对齐的访问。因此,这绝对是不可接受的。虽然它可能在某些处理器上工作-例如,x86如果稍微慢一点,将很高兴读取未对齐的内存。我认为您可以回退,但在回退后无法使用:)不过我得检查一下。你说“你能把它放回去吗?”是什么意思?@JohnDibling删除了那个部分(发现放回去是必须的)。在C++
中,最好使用static\u cast
而不是C
样式的铸造。原来的char*
是新char[42]
的结果。