我现在正在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条答案
按热度按时间gtlvzcf81#
整数可以是编译器编写者喜欢的任何大小,唯一的规则(在标准C中)是:a)
int
不小于a short或不大于a long,b)int
至少有16位。在64位平台上,为了兼容性而将int保持为32位并不罕见。
68bkxrlz2#
当要传递的值大于引用的大小时,通过引用传递比通过值传递更有效。如果要传递的是一个大型结构/对象,通过引用传递很有意义。如果要对值进行持久化修改,通过引用传递也很有意义。
gstyhher3#
通过引用传递更有效,因为不需要复制任何数据(除了指针)。这意味着只有在传递具有许多字段或结构或任何其他数据大于所使用的系统上的指针的类时,这才更有效。
在你提到的情况下,不使用指针确实会更有效,因为实际值小于指向它的指针(至少在你使用的机器上是这样)。请记住,在32位机器上,指针有4个字节(48 = 32位),而在64位机器上,你显然使用的指针有8个字节(88 = 64位)。
在更老的16位机器上,指针只需要2个字节,也许有一些嵌入式系统仍然使用这种架构,但我不知道这一点。
jyztefdp4#
在C语言中,一个指针,任何指针,只是一个内存地址。你在一个64位的机器上,在硬件级别,内存地址是用64位的值引用的。这就是为什么64位的机器比32位的机器能使用更多的内存。
alen0pnh5#
一个是地址,一个指向某个东西的指针,不管它是char、short、int还是structure;另一个是特定于语言的东西,称为int,该系统的编译器和该版本的编译器以及命令行选项碰巧定义为某个大小。
看起来好像你运行在一个64位的系统上,所以你所有的指针/地址都是64位的。他们所指的是一个单独的讨论,长可能也是64位的,有时是整数,短可能仍然是16位,但不是一个硬/快的规则,字符希望是8位,但也不是一个硬/快的规则。
在使用llvm-gcc时,在clang像现在这样可靠之前,这种情况可能会变得更糟。对于64位主机,字节码都是基于64位主机生成的,因此64位整数,64位指针,然后当你为arm目标做后端时,它必须使用编译器库调用所有这些64位工作。变量几乎不需要是短整型,更不用说整型了,而是整型。-m32开关坏了,由于主机不是最终目标,您仍然得到64位整型。gcc似乎没有这个问题,clang+llvm目前也没有这个问题。
简短的回答是语言定义了一些数据类型char,short,int,long等,这些数据类型有编译器实现定义的大小。而address只是另一个实现定义的数据类型。这就像问为什么short和long的字节数不一样?因为它们是不同的数据类型,一个是short,一个是long。一个是地址,另一个是变量,是两码事。
wxclj1h56#
一个整数指针可以指向一个整数,但同一个指针也可以指向十个、二十个、一百个或一百万个整数。
显然,传递一个8字节指针代替一个4字节整数并不是什么好事;但是传递单个8字节指针代替一百万个4字节整数肯定是这样的。
mepcadol7#
http://developers.sun.com/solaris/articles/ILP32toLP64Issues.html
当将32位程序转换为64位程序时,只有长类型和指针类型的大小从32位变为64位;int类型的整数保持在32位大小。
在64位可执行文件中,指针是64位的。长整型也是64位的,但整型只有32位。
在32位的可执行文件中,指针、int和long int都是32位的。32位的可执行文件也支持64位的long int。
webghufk8#
一个指针必须能够引用所有的内存。如果(虚拟)内存大于4Gi字节左右,那么指针必须大于32位。