代码之家  ›  专栏  ›  技术社区  ›  PJT

SPARC电路中的C++总线错误

  •  0
  • PJT  · 技术社区  · 15 年前

    我想知道为什么这个代码会出现总线错误。

    int main()
    {
    int p=34;
    int *pp= (int *) ((char *)&p+1);
    cout<<*pp<<"\n";
    return 0;
    }
    
    2 回复  |  直到 12 年前
        1
  •  10
  •   paxdiablo    12 年前

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

    如果您访问不对齐的数据,一些架构将不关心,其他架构将运行得更慢,还有一些架构(例如在本例中)将陷入尖叫的堆中。

    当你 创造 整数 p ,它将在堆栈上正确对齐,地址为正确的倍数。

    通过在字节上向上移动该地址,并将其作为 int ,你导致了 SIGBUS .

    This link 在Oracle上显示了对齐要求。简而言之:

    • 短整数在16位边界上对齐。
    • int整数在32位边界上对齐。
    • 对于SPARC系统,长整数在64位边界上对齐。
    • 长整型在64位边界上对齐。
        2
  •  1
  •   wallyk    15 年前

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

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

    顺便说一下,这样的低地址不太可能在有效内存中。但您的示例确实说明了对齐异常优先于segfault异常。