C为什么指针大于整数

时间:2012-02-20 18:22:47

标签: c memory embedded

我正在Linux机器上玩GCC中的sizeof(),我发现了一些非常令人惊讶的东西。

printf ("\nsize of int = %lu\n", sizeof(int));
printf ("\nsize of int* = %lu\n", sizeof(int *));

产量

size of int = 4
size of int* = 8

我认为指向整数的指针的大小会比实际的整数本身小得多!

我正在研究嵌入式软件,我的理解是,通过引用传递比传递值更有效(在功率方面)。

如果指针的大小大于实际值,有人可以澄清为什么通过引用传递比通过值更有效。

谢谢!

8 个答案:

答案 0 :(得分:9)

整数可以是编译器编写者喜欢的任何大小,唯一的规则(在标准C中)是:a)int不小于short或大于long,b){{1}至少有16位。

在64位平台上,为了兼容性,将int保持为32位并不罕见。

答案 1 :(得分:5)

当要传递的值大于引用的大小时,通过引用传递比传递值更有效。如果传递的是大型结构/对象,则通过引用传递很有意义。如果要对值进行持久修改,传递引用也是有意义的。

答案 2 :(得分:3)

通过引用传递更有效,因为不需要复制数据(指针除外)。这意味着当传递具有许多字段或结构的类或任何大于所用系统上的指针的数据时,这只会更有效。

在你提到的情况下,不使用指针确实更有效,因为实际值小于指向它的指针(至少在你正在使用的机器上)。 请记住,在3​​2位机器上,指针有4个字节(4 * 8 = 32位),而在64位机器上,你显然使用指针有8个字节(8 * 8 = 64位)。

在更老的16位机器上,指针只需要2个字节,也许有些嵌入式系统仍在使用这种架构,但我不知道这个......

答案 3 :(得分:2)

在C中,指针,任何指针,只是一个内存地址。您使用的是64位计算机,而在硬件级别,内存地址使用64位值。这就是为什么64位计算机可以使用比32位计算机更多的内存。

答案 4 :(得分:2)

指向整数的指针可以指向一个整数,但同一指针也可以指向十,二十,一百或一百万个整数。

显然,传递单个8字节指针代替单个4字节整数并不是一个胜利;但是传递一个8字节的指针代替一百万个4字节整数当然是。

答案 5 :(得分:1)

有一件事与另一件事无关。一个是地址,指向某个东西的指针,如果它是char或short或int或结构则无关紧要。另一种是一种特定于语言的东西,称为int,该系统的编译器和该版本的编译器以及命令行选项恰好定义为某种大小。

看起来好像是在64位系统上运行,因此所有指针/地址都将是64位。他们指出的是一个单独的讨论,多头也可能是64位,有时是整数,短路可能仍然是16位但不是硬/快规则和chars希望8位,但也不是硬/快规则。

这可能会变得更糟的是交叉编译,而使用llvm-gcc,在cl​​ang之前就像现在一样坚固。对于64位主机,字节码全部是基于64位主机生成的,所以64位整数,64位指针等等。然后当你为arm目标做后端时,它必须使用编译器库调用所有这一切64位工作。这些变量几乎不需要短缺,而是整数。由于主机不是最终目标,-m32开关被打破,你仍然有64位整数。 gcc直接似乎没有这个问题,clang + llvm目前也没有这个问题。

简短的回答是语言定义了一些数据类型char,short,int,long等,而那些数据类型具有编译器实现定义的大小。和address只是另一种实现定义的数据类型。这就像问为什么短的不一样的字节数长?因为它们是不同的数据类型,所以一个是短的,一个是长的。一个是地址,另一个是变量,两个不同的东西。

答案 6 :(得分:0)

  

http://developers.sun.com/solaris/articles/ILP32toLP64Issues.html

     

将32位程序转换为64位程序时,只能使用长类型   和指针类型的大小从32位变为64位;整数   type int保持32位大小。

在64位可执行文件中,指针是64位。长整数也是64位,但整数只有32位。

在32位可执行文件中,指针,int和long int都是32位。 32位可执行文件也支持64位" long long"整数。

答案 7 :(得分:0)

指针必须能够引用所有内存。如果(虚拟)存储器大于4 Gi字节,那么指针必须大于32位。