AnT*_*AnT 122
这个问题的答案取决于我们愿意接受的实际考虑距离.
最后,从理论上讲,C和C++中的所有内容都取决于编译器,而且仅取决于编译器.硬件/操作系统根本不重要.编译器可以自由地实现任何厚度的硬件抽象层,并且可以模拟任何东西.没有什么可以阻止C或C++实现实现int任何大小的类型和任何表示,只要它足够大以满足语言标准中指定的最低要求.这种抽象级别的实际例子是容易获得的,例如基于"虚拟机"平台的编程语言,如Java.
但是,C和C++旨在成为高效语言.为了实现最高效率,C或C++实现必须考虑从底层硬件派生的某些考虑因素.因此,确保每种基本类型都基于硬件直接(或几乎直接)支持的某种表示非常有意义.从这个意义上说,基本类型的大小取决于硬件.
换句话说,64位硬件/ OS平台的特定C或C++实现完全可以自由地实现int为占用128位存储器的71位1补码有符号整数类型,使用其他57位作为填充位总是需要存储编译器作者的女朋友的生日.这种实现甚至具有一定的实用价值:它可用于执行C/C++程序可移植性的运行时测试.但这就是该实施的实际用途将结束的地方.不要指望在"普通"的C/C++编译器中看到类似的东西.
min*_*ang 33
是的,它取决于两个处理器(更具体地说,ISA,指令集架构,例如x86和x86-64)和编译器,包括编程模型.例如,在16位机器中,sizeof(int)是2个字节.32位机器有4个字节int.它被认为int是处理器的原始大小,即寄存器的大小.然而,32位计算机如此受欢迎,并且已经为32位编程模型编写了大量软件.因此,如果64位计算机有8个字节,那将是非常混乱的int.Linux和Windows都保留4个字节int.但是,它们的大小不同long.
请查看适用于大多数*nix和LLP64 for Windows 的64位编程模型,如LP64:
当您编写应该在Window和Linux上运行的代码时,这种差异实际上非常令人尴尬.所以,我总是使用int32_t或者int64_t而不是long通过stdint.h.
是的,它会的.它们的意思是"它依赖于哪个:编译器还是处理器"?在这种情况下,答案基本上都是"两者".通常,int不会大于处理器寄存器(除非小于16位),但它可能更小(例如,在64位处理器上运行的32位编译器).但是,通常,您需要一个64位处理器来运行具有64位int的代码.
小智 6
基于最近的一些研究,我已经研究过固件访谈:
处理器位架构即最显著的影响,8位,16位,32位,64位是需要如何最有效的信息的每个字节以最佳计算变量的存储周期的最低数量.
处理器的位大小告诉您CPU在一个周期内能够处理的自然字长.如果在内存中正确对齐,32位机器需要2个周期来处理64位双倍.大多数个人计算机过去和现在仍然是32位,因此最可能的原因是C编译器对32位整数具有典型的亲和性,可选择较大的浮点数和长的整数.
显然,您可以计算更大的变量大小,因此从这个意义上说,CPU的位体系结构决定了它如何存储更大和更小的变量以实现最佳的处理效率,但它绝不是字节大小定义的限制因素.对于整数或字符,这是编制者的一部分,以及由公约或标准规定的内容.
我发现这个网站非常有用,http://www.geeksforgeeks.org/archives/9705,用于解释CPU的自然字长如何影响它如何选择存储和处理更大和更小的变量类型,特别是在位打包方面结构.你必须非常认识到你是如何选择,因为较大的变量需要,使他们采取数量最少的周期时,由CPU的字长划分以在内存中排列给变量赋值.如果您对变量的分配排序不当,这将为诸如结构之类的内容添加许多可能不必要的缓冲区/空白空间.