C++中char*、int*、void*等指针类型的对齐限制相关疑问
C++ 三类指针对齐限制说明
核心逻辑
所有指针的地址合法性限制,完全由它指向的类型的内存对齐(alignment)要求决定:CPU访问内存时,要求n字节大小的基础类型的存储地址必须是n的整数倍,否则会触发访问异常或严重的性能损耗。
三类指针的具体限制
char*
指向的char类型大小为1字节,对齐要求为1,因此地址可以是任意整数,包括奇数值,不存在访问限制。int*
主流桌面/移动端系统(x86、x86_64、ARM)上int大小为4字节,对齐要求为4,因此int*的地址值必须是4的整数倍,二进制最后两位为0,不能为奇数值。如果强行给int*赋值奇数地址并读写,属于C++标准定义的未定义行为,轻则访问性能暴跌几十倍,重则直接触发硬件异常导致程序崩溃。void*
属于无类型指针,本身不支持解引用操作,仅用来存储内存地址,因此可以存放任意合法的地址值,没有对齐限制。但如果将void*强转为其他类型的指针,必须满足目标类型的对齐要求,否则会和int*非对齐访问一样触发未定义行为。
常见错误示例
char buf[10] = {0}; // 非法:buf+1的地址不是4的倍数,强转int*后访问会出问题 int* p = reinterpret_cast<int*>(buf + 1); int val = *p; // 未定义行为
注意:极少数架构(如x86)硬件支持非对齐访问,不会直接崩溃,但这种写法完全不可移植,且性能损失极大,绝对不允许在正式代码中使用。
内容的提问来源于stack exchange,提问作者IcanCode
相关产品推荐
相关产品推荐

