首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异域硬件上的C++11

异域硬件上的C++11
EN

Stack Overflow用户
提问于 2017-07-15 15:38:04
回答 4查看 468关注 0票数 8

在2011年,有一个类似的问题:标准委员会关心的异国情调架构

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

目前存在哪些硬件,哪种硬件有C++11编译器,可以被认为是异国情调?

我认为什么是异国情调?

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

因此,我们在x86/ARM世界上看到的任何不符合标准的东西,我们都有:

  • 有8/16/32位双补整数
  • IEEE754浮动,有些完全兼容,有些不兼容,但使用IEEE754格式
  • 线性记忆模型

注意:我想知道答案,其中C++11一致性编译器为硬件存在,而不是C++编译器存在的地方,但不是完全一致的。

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

EN

回答 4

Stack Overflow用户

发布于 2017-07-15 15:59:06

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

例如,摩托罗拉/飞思卡尔/NXP 56720有一个可用于任务处理的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个周期。这个核不是好的和桶移动,掩蔽,或-。

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

票数 6
EN

Stack Overflow用户

发布于 2017-07-15 18:15:24

有些计算机的寄存器具有不同的位宽。

CDC Cyber系列使用6位来表示公共字符,对非公共字符使用扩展的12位。

但是,为了符合C语言标准,编译器需要使用12位字符,因为6位不满足最小范围。

至于其他需求,您正在谈论的是宇宙中的一小部分:自定义实现。有些平台可能有80位浮点。一些平台可以使用4位作为它们的最小寻址单元.

大多数硬件部件制造商已经在8位、16位、32位、64位或128位单元上标准化.要获得其他非标准单位,您可能必须增加现有的标准尺寸。标准化降低了集成电路的成本。

一些硬件部件,如Digital转换器(DAC)和模拟到数字转换器( ADC ),其位宽不能被8整除。例如,12位ADC非常常见。

让我们来谈谈真正的定制:可编程门阵列,例如FPGA。基本上,您可以编程该设备有任意数量的输入或输出或内部总线。

摘要:

为了与C或C++兼容,必须满足一组最低标准。编译器负责分配寄存器和内存以满足标准。如果一个字符是6位,编译器必须使用两个6位单元来满足字符的最小范围。

票数 4
EN

Stack Overflow用户

发布于 2017-07-15 16:13:10

当人们说定义了实现时,这并不仅仅适用于内存模型、基本变量大小等(即硬件实现),而是它可能依赖于特定的编译器实现(不同的编译器可能会以不同的方式处理某些事情,而通常会执行)和/或为程序编译的操作系统。因此,即使根据您的定义,绝大多数硬件可能是非奇异的,但仍然是,“您不能依赖它,它是实现定义的” ;)

例如: C++标准规定,long double类型必须至少与普通double一样大(即8字节),但它是实现定义的,而实际上,虽然g++为x64平台实现了16字节长的long double,而最新的VC++编译器与double一样只有8字节长,但这在将来可能会发生变化--您永远不会知道它的实现定义了E 218,微软可以随时更改它,并且仍然会遵守该标准。

这不是你所问问题的确切答案,而是回答了你问题的最后几段(“我能在多大程度上依赖于标准?”)很明显,这可能会让你重新审视你思考这个问题的方式。此外,它是一个评论有点长,将是较少的可读性,所以我将它留在这里。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45119928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档