1

我观察到 long 的大小总是等于任何给定 CPU 架构的 WORD 大小。对所有架构都适用吗?我正在寻找一种可移植的方式来表示 C 中的 WORD 大小的变量。

4

6 回答 6

3

不。事实上,标量和向量单位通常有不同的字长。然后是字符串指令和具有古怪功能的内置 DMA 控制器。

如果你想快速复制数据,memcpy来自平台的标准 C 库通常是最快的。

于 2010-03-22T00:54:24.563 回答
3

C不处理指令。struct在 C99 中,您可以使用单个分配复制任何大小:

struct huge { int data[1 << 20]; };
struct huge a, b;
a = b;

使用智能编译器,这应该会生成最快的(单线程,但将来希望是多线程的)代码来执行复制。

int_fast8_t如果您想要供应商定义的“尽可能快的”整数类型,则可以使用该类型。这可能与字长相对应,但肯定不能保证它甚至是单指令可写的。

我认为您最好的选择是默认为一种类型(例如int)并使用 C 预处理器来优化某些 CPU。

于 2010-03-22T00:26:09.683 回答
2

在 Windows 下,sizeof(long)是 4,即使在 64 位版本的 Windows 上也是如此。

于 2010-03-22T00:33:15.363 回答
1

不,标准没有这种类型(具有最大的内存吞吐量)。

但它指出,int对于在其上执行 ALU 操作的处理器来说,它必须是最快的类型。

于 2010-03-22T00:34:19.680 回答
1

我想你会得到最接近的答案是......

  • int并且unsigned int经常(但不总是)匹配机器的寄存器宽度。
  • 有一种类型是与指针大小相同的整数,拼写intptr_t可从 stddef.h IIRC 获得。这显然应该与您的体系结构的地址宽度相匹配,尽管我不知道有任何保证。

然而,架构通常没有单一的字长 - 可以有不同宽度的寄存器(例如,“正常”与 Intel x86 中的 MMX 寄存器),寄存器宽度通常与总线宽度不匹配,地址和数据可能有不同的宽度等等。

于 2010-03-22T00:37:21.710 回答
1

在嵌入式世界中,事情会变得更加复杂。ASAIK,C51 是 8 位处理器,但在 Keil C for c51 中,长有 4 个字节。我认为它依赖于编译器。

于 2010-03-22T01:35:35.720 回答