以下内容来自“家庭填写”编程测试,该测试是英国大学游戏开发理学硕士申请流程的一部分:
C ++基础知识
如果一个程序声明了四个变量,一个是类型
int
,一个是类型float
,类型char
之一,类型bool
之一,即变量 会占用内存中至少的空间吗?
- INT
- 炭
- 浮
- BOOL
醇>
根据说明,只有一个真实的陈述。但是,我的C ++书(C ++ Pocket Reference,O'Reilly)指出:“bool的典型大小是一个字节”,“char的大小是一个字节。技术上,字节的大小是实现定义的,但是它几乎不是八位。“
我在这里误解了什么吗?你会给出什么答案?为什么?
答案 0 :(得分:32)
没有类型少而不是char
,因为根据定义sizeof(char) == 1
。但是,所有类型完全有可能采用相同的空间量。
(用16位表示每种类型(具有适当的异常浮点格式)就足以满足标准值范围要求;存在每种类型都有32位的实际硬件。)
答案 1 :(得分:11)
如果程序声明了四个变量,一个是int类型,一个是float类型,一个是char类型,另一个是bool类型,哪个变量占用内存中的空间最小?
您发布的问题的真正问题在于:
occupy ... space in memory
如果要假设解释,那么在大多数情况下,您会假设当前流行的编译器之一,在这种情况下,答案2
和4
将占用内存中的最小空间。仅仅因为当前流行的编译器使char
和bool
在内存中占用一个字节...
正如评论中所述,sizeof() is of type size_t
,which is integral。
由于sizeof(char) == 1
始终符合标准,因此值是积分的;没有其他sizeof(T)
可以低于1
。但是除了T
之外的任何其他char
都可以大于1
依赖于实现。由于你无法假设sizeof(char) == sizeof(bool)
总是成立,你至少可以假设sizeof(char) <= sizeof(bool)
成立。
这使sizeof(char)
成为最不正确的答案......
答案 2 :(得分:4)
答案是char
。没有其他答案是正确的。
(虽然我同意这个问题应该措辞得更好)。
C ++ 03标准$ 5.3.3 / 1说:
sizeof(char),sizeof(signed char)和sizeof(unsigned char)为1;该 sizeof应用于任何其他基本类型(3.9.1)的结果是 实现定义。 [注意:特别是sizeof(bool)和 sizeof(wchar_t)是实现定义的.69)
(从另一个问题中找到此信息:Why the sizeof(bool) is not defined to be one, by the Standard itself?)。
鉴于最小大小为1(sizeof必须返回整数值),这意味着符合标准的任何实现中都会出现以下情况:
sizeof(char) == 1
sizeof(bool) >= 1
sizeof(int) >= 1
sizeof(float) >= 1
这个问题措辞很差,可能应该更清楚地被问到“......哪个变量在内存中不会占用任何其他空间(在任何表现良好的C ++标准实现中)?”
答案 3 :(得分:2)
该语言未指定这些类型大小之间的任何关系,以保证对所提出的问题的正确答案。例如,它们都可以是32位类型。
答案 4 :(得分:2)
我认为正确的答案应该是2.根据定义,char是最小的可寻址单元。
答案 5 :(得分:2)
C ++标准给出了以下关系:
sizeof(char) == 1
sizeof(char) <= sizeof(int) <= sizeof(long)
sizeof(float) <= sizeof(double)
...
答案 6 :(得分:1)
不保证这些类型的确切大小,但有一个保证,char不大于short,short不大于long。
因此,char将始终占用最少的内存,但它可能不是唯一一个这样做的内存。它仍然有保证,没有别的东西会有更小的尺寸。
然而,在一些特殊的嵌入式微控制器上,bool可能有例外。它们可以有一个bit
变量,只需要一位,但是它们不在RAM中,而是在特殊的寄存器中。
但是,除非您的体系结构和编译器特别奇怪或不寻常,否则您可以合理地预期char
为1,short
为2,long
为4,long long
是8,int
是2或4,但通常是4个字节。
答案 7 :(得分:0)
答案 8 :(得分:0)
正确答案在理论上是布尔值,因为char需要至少8位的知识,而bool在技术上只需要一位。如果你在理论上想要的话,你可以在一个字母内部粉碎8个bool。
答案 9 :(得分:0)
bool
的典型大小是一个字节。并不意味着它总是是一个字节< / em>的。问题要么指的是没有一个字节大小bool
的实现,要么意味着只有一个变量的大小最小。