我观察到 long 的大小总是等于任何给定 CPU 架构的 WORD 大小。对所有架构都适用吗?我正在寻找一种可移植的方式来表示 C 中的 WORD 大小的变量。
6 回答
不。事实上,标量和向量单位通常有不同的字长。然后是字符串指令和具有古怪功能的内置 DMA 控制器。
如果你想快速复制数据,memcpy
来自平台的标准 C 库通常是最快的。
C不处理指令。struct
在 C99 中,您可以使用单个分配复制任何大小:
struct huge { int data[1 << 20]; };
struct huge a, b;
a = b;
使用智能编译器,这应该会生成最快的(单线程,但将来希望是多线程的)代码来执行复制。
int_fast8_t
如果您想要供应商定义的“尽可能快的”整数类型,则可以使用该类型。这可能与字长相对应,但肯定不能保证它甚至是单指令可写的。
我认为您最好的选择是默认为一种类型(例如int
)并使用 C 预处理器来优化某些 CPU。
在 Windows 下,sizeof(long)
是 4,即使在 64 位版本的 Windows 上也是如此。
不,标准没有这种类型(具有最大的内存吞吐量)。
但它指出,int
对于在其上执行 ALU 操作的处理器来说,它必须是最快的类型。
我想你会得到最接近的答案是......
int
并且unsigned int
经常(但不总是)匹配机器的寄存器宽度。- 有一种类型是与指针大小相同的整数,拼写
intptr_t
可从 stddef.h IIRC 获得。这显然应该与您的体系结构的地址宽度相匹配,尽管我不知道有任何保证。
然而,架构通常没有单一的字长 - 可以有不同宽度的寄存器(例如,“正常”与 Intel x86 中的 MMX 寄存器),寄存器宽度通常与总线宽度不匹配,地址和数据可能有不同的宽度等等。
在嵌入式世界中,事情会变得更加复杂。ASAIK,C51 是 8 位处理器,但在 Keil C for c51 中,长有 4 个字节。我认为它依赖于编译器。