数据类型硬件体系结构的大小是依赖还是依赖于编译器?
我想知道哪些因素对确定数据类型的大小有实际影响?
答案 0 :(得分:3)
编译器(更恰当地说是“实现”)可以自由选择大小,受C标准的限制(例如int必须至少为16位)。编译器可以选择使其自身符合其他标准,如POSIX,它可以添加更多约束。例如,我认为POSIX表示所有数据指针大小相同,而C标准对sizeof(int*) != sizeof(char*)
非常满意。
在实践中,编译器 - 编写者的决策受到体系结构的强烈影响,因为除非有强烈的理由否则他们希望实现高效且可互操作。处理器制造商或操作系统供应商经常发布称为“C ABI”的东西,它告诉您(除其他外),类型有多大以及它们如何存储在内存中。编译器永远不必为其架构遵循标准ABI,并且CPU通常具有多个公共ABI,但是直接从一个编译器中的代码调用以编码另一个编译器,两个编译器必须使用相同的ABI。因此,如果您的C编译器不在Windows上使用Windows ABI,那么您需要额外的包装器来调用Windows dll。如果您的编译器支持多个平台,那么很可能在不同平台上使用不同的ABI。
您经常会看到用于表示正在使用多个ABI中的哪一个的缩写。因此,例如当64位平台上的编译器说它是LP64时,这意味着long
和指针是64位,而省略int
是32位。如果它说ILP64,那意味着int
也是64位。
最后,更多的情况是编译器 - 作者从一个明智的选项菜单中选择,而不是随意挑选数字。但实施总是随心所欲。如果你想为x86编写一个模拟具有9位字节和3字节字的机器的编译器,那么C标准允许它。但就操作系统而言,你只能靠自己。
答案 1 :(得分:1)
大小最终由编译器决定。例如Java有一组固定的大小(8,16,32,64),而C为各种类型提供的大小集合部分取决于它运行的硬件;即编译器做出选择但是(除了像Java这样的情况,其中数据类型明确独立于底层硬件)受到硬件提供的强烈影响。
答案 2 :(得分:0)
不同数据类型的大小是编译器,它的配置,依赖(不同的编译器,或不同的开关到同一个编译器,在某些机器上可以有不同的大小)。
通常编译器与其安装的硬件相匹配......因此您可以说类型的大小也取决于硬件。使编译器在48位的机器上发出16位指针会产生反作用 但是可以在计算机上使用编译器来创建一个程序,以便在不同大小的不同计算机上运行。
答案 3 :(得分:0)
这取决于目标硬件架构,操作系统以及可能的编译器。
intel编译器按如下方式调整一个长整数:
OS arch size Windows IA-32 4 bytes Windows Intel 64 4 bytes Windows IA-64 4 bytes Linux IA-32 4 bytes Linux Intel 64 8 bytes Linux IA-64 8 bytes Mac OS X IA-32 4 bytes Mac OS X Intel 64 8 bytes
此处为显示microsoft visual c++ compiler上的尺寸的链接。
答案 4 :(得分:0)
您的问题的答案是 是 ,我会解释。
考虑常见的存储类型,即size_t,int64_t等。这些在编译时决定(在大多数情况下定义),具体取决于您构建的体系结构。没有它们?不用担心,编译器会弄清楚int的基本含义以及无符号的影响。
一旦标准C标头找出所需的字长,一切都只是调整到您的系统。
当然,除非您恰好是交叉编译,否则它们将由您指定的任何架构决定(或定义)。
简而言之,您的编译器(主要是预处理器)将调整类型以适应目标体系结构。无论是你正在使用的那个,还是你正在编译的那个。
这是如果我正确理解你的问题。这是该语言提供的为数不多的“神奇”抽象之一,也是其经常被称为“便携式装配”的部分原因。
答案 5 :(得分:0)
“native”数据类型的大小取决于编译器。虽然这反过来受硬件的影响,但我不会开始猜测。
查看<stdint.h>
- 该标题具有与平台无关的typedef,可满足您的任何需求。
答案 6 :(得分:0)
\\它完全依赖于编译器。
或者更准确地说C语言标准依赖(http://en.wikipedia.org/wiki/C99)。
在标准中明确指定了bult-in类型的大小。
但。它们并非固定在“那么一个人”的基础上
任何架构上的任何编译器都需要保留最小尺寸(例如 char 至少为8位)。
但它也可以是16或甚至32位 char 取决于arch
并且还保留了不同类型之间的相关尺寸
这意味着,例如 short 可以是8位,16位或32位,但它的长度不能超过同一架构上更宽的类型 int 。 />
只有更小或相同的长度。
如果他们想要制作C标准兼容的编译器,那么编译器开发人员必须工作的边界。