C++ C++;SPARC电弧结构中的总线错误

C++ C++;SPARC电弧结构中的总线错误,c++,bus-error,C++,Bus Error,我想了解为什么我得到了这个代码的总线错误 int main() { int p=34; int *pp= (int *) ((char *)&p+1); cout<<*pp<<"\n"; return 0; } intmain() { int p=34; int*pp=(int*)((char*)和p+1); 这无疑是一个对齐问题。在许多体系结构中,某些类型必须正确对齐,例如4字节整数必须从4字节边界开始 如果您访问不一致的数据,一些体系结构将不关心,其他体系结

我想了解为什么我得到了这个代码的总线错误

int main()
{
int p=34;
int *pp= (int *) ((char *)&p+1);
cout<<*pp<<"\n";
return 0;
}
intmain()
{
int p=34;
int*pp=(int*)((char*)和p+1);

这无疑是一个对齐问题。在许多体系结构中,某些类型必须正确对齐,例如4字节整数必须从4字节边界开始

如果您访问不一致的数据,一些体系结构将不关心,其他体系结构将运行得更慢,还有一些体系结构(如本例中的体系结构)将陷入一个尖叫的堆中

当您创建整数
p
时,它将在堆栈上以正确的倍数地址正确对齐

通过在字节上向上移动该地址,并将其作为
int
取消引用,您将导致
SIGBUS

at Oracle显示了对齐要求。简言之:

  • 短整数在16位边界上对齐
  • 整数在32位边界上对齐
  • 对于SPARC系统,长整数在64位边界上对齐
  • 长整数在64位边界上对齐

这无疑是一个对齐问题。在许多体系结构中,某些类型必须正确对齐,例如4字节整数必须从4字节边界开始

如果您访问不一致的数据,一些体系结构将不关心,其他体系结构将运行得更慢,还有一些体系结构(如本例中的体系结构)将陷入一个尖叫的堆中

当您创建整数
p
时,它将在堆栈上以正确的倍数地址正确对齐

通过在字节上向上移动该地址,并将其作为
int
取消引用,您将导致
SIGBUS

at Oracle显示了对齐要求。简言之:

  • 短整数在16位边界上对齐
  • 整数在32位边界上对齐
  • 对于SPARC系统,长整数在64位边界上对齐
  • 长整数在64位边界上对齐

16位数量必须以16位或2字节对齐方式存储,32位(4字节)必须以4的倍数存储

许多CPU支持未对齐的访问,但这需要芯片中额外的电路和额外的执行时间来运行额外的内存总线周期以拾取奇数字节。这是一种特别常见的RISC处理器原理,需要编译器和程序员更加小心地布局数据,以提高速度和简化circuitry是一种可接受的权衡


顺便说一句,像这样的低地址无论如何都不可能存在于有效内存中。但您的示例确实说明了对齐异常优先于SEGFAULT异常。

16位数量必须以16位或2字节对齐方式存储,32位(4字节)数量必须以4的倍数存储

许多CPU支持未对齐的访问,但这需要芯片中额外的电路和额外的执行时间来运行额外的内存总线周期以拾取奇数字节。这是一种特别常见的RISC处理器原理,需要编译器和程序员更加小心地布局数据,以提高速度和简化circuitry是一种可接受的权衡


顺便说一句,像这样的低地址无论如何都不可能在有效内存中。但您的示例确实说明了对齐异常优先于SEGFULT异常。

谢谢这帮了大忙!我现在理解了它们所说的不对齐地址的含义。值得注意的是,许多体系结构都会容忍未对齐的memory访问,只会导致性能损失(x86和ARM就是这种情况),但如果尝试未对齐的内存访问,SPARC尤其会导致出现陷阱。这帮了大忙!我现在理解了不对齐地址的含义。值得注意的是,许多体系结构都会容忍未对齐的内存访问,只会导致性能下降(x86和ARM就是这种情况),但SPARC尤其会导致在尝试未对齐的内存访问时出现陷阱。这是未定义的行为。您正在读取越界。因此,程序可能会以更富有想象力的方式爆炸。除了对齐问题,这是未定义的行为。您正在读取越界。作为结果该计划可能会以更富有想象力的方式爆发。