gpt4 book ai didi

奇异硬件上的 C++11

转载 作者:可可西里 更新时间:2023-11-01 18:19:47 25 4
gpt4 key购买 nike

2011年以前有过这样的问题:Exotic architectures the standards committees care about

现在,我想问一个非常相似的问题,但这次,我是从程序员的角度,从 C++11 的角度来问的。

目前存在哪些硬件,哪些具有 C++11 编译器,并且可以被认为是奇特的?

我认为异国情调的是什么?

  • 其中一个字符不是 8 位
  • IEEE 754 float 格式不可用
  • 其中整数未编码为两个补码
  • 编译器不支持 8、16 或 32 位类型
  • 内存模型是非线性的(因此,您无法比较/减去任何指针)

所以任何不是我们在 x86/ARM 世界中看到的标准的东西,我们有:

  • 有 8/16/32 位两个补整数
  • IEEE754 float ,一些完全兼容,一些不兼容,但使用 IEEE754 格式
  • 线性内存模型

注意:我想知道硬件的C++11 兼容编译器的答案,而不是 C++ 编译器存在但不完全兼容的地方。

我问这个,因为很多时候,我得到的答案是“你不能依赖它,它是由实现定义的”,我想知道,实际上,在现实世界中,有多少我可以依赖标准。举个例子:每当我编写 std::uint16_t 时,我可能会担心(因为此功能是可选的),在平台上,这种类型是不存在的。但是,是否存在不存在这种类型的实际平台?

最佳答案

去寻找 DSP 内核,这是“异国情调”架构的最佳选择。

例如,Motorola/Freescale/NXP 56720 有一个可从 Tasking 获得的 C++ 编译器,但在三个或更多总线上有 24 位内存。我认为设备上的堆栈模型(至少是较旧的 56K 设备)是硬件堆栈,并不真正适合 C/C++ 模型。

编辑:更多细节...

这只野兽上的寄存器模型很奇怪:

  1. 累加器(56 位,分为 8 位、24 位、24 位子寄存器)
  2. 数据寄存器(24 或 48 位)
  3. 地址寄存器(R0..7、M0..7 和 N0..7)用于地址、模和步长

模数和步长寄存器不映射到 C/C++ 中的任何固有模型,因此总是有一些奇怪的结构和 #pragma 来帮助编译器支持循环缓冲区。

没有堆栈指针(没有推送或弹出指令)。函数返回地址有一个硬件堆栈,但只有 16 个调用深度。软件必须管理溢出,并且局部变量不在堆栈中。

因为没有堆栈,编译器会做一些奇怪的事情,比如静态调用树分析,并将局部变量放在覆盖的内存池中。这意味着没有可重入函数,并且必须只有一个上下文,没有太多的怪异或严重的性能损失。

sizeof(int) = sizeof(char) = sizeof(short) = 1 = 24 位

这意味着没有字节访问(至少在旧的 56002 上,不确定 56300)。我认为从 24 位整数数组中读取/写入特定字节大约需要 24 个周期。这个核心不好和桶形移位、掩蔽和 or-ing

当然不是所有的 DSP 核心都是这样,但它们通常与 32/64 位统一内存标准和 GCC 的 sizeof(char)=1 期望有不同程度的“怪异”,因为固有模指针和多个内存总线。

关于奇异硬件上的 C++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45119928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com