【发布时间】:2011-04-23 06:35:00
【问题描述】:
首先,在我的系统上保持以下状态:sizeof(char) == 1 和 sizeof(char*) == 4。
很简单,当我们在下面计算类的总大小时:
class SampleClass { char c; char* c_ptr; };
我们可以说sizeof(SampleClass) = 5。但是,当我们编译代码时,我们很容易看到sizeof(SampleClass) = 8。
所以问题是“计算的问题在哪里?” :S
- 语言:C++
- 编译器:gcc 4.4.0
- 操作系统:Tinycore
【问题讨论】:
-
“每个人都知道一个 char 占用 1 个字节,而一个指针占用 4 个字节” 人们不知道这一点,因为它不是真的,除非在一组选定的架构上。近年来非常常见的场景,但是对于所谓的“事实”中的任何一个都没有根本性。请注意,
sizeof(char)是 1,但 not 是否意味着一个字符是 8 位。 -
绝对你是对的,但由于我在问题的最后一行定义,它仅限于我拥有的环境(32 位拱门,32 位操作系统)。无论如何,谢谢你的警告。
-
即使说您使用的是 32 位机器也不能证明这些陈述中的任何一个都是正确的。您习惯使用的机器是 32 位字,但具有 8 位字节寻址能力。可能存在只能寻址 32 位块的 32 位字的机器,在这种情况下,原始字符 必须 为 32 位,
sizeof(void *)很可能是 1(现在是时候了实现压缩字符类型以避免在每个char上浪费 24 位)。要做出这样的声明,您必须命名架构和编译器(包括版本)。 -
仅供参考,操作系统:tinycore 3 编译器:gcc4.4.0 架构:atom x86
-
@dmckee:这样的环境不会是 linux(至少,不是我们所知道的 linux。也许是受 linux 启发的东西)。 POSIX 要求
CHAR_BIT完全是 8。当然,通过仿真,您可以在该硬件之上的某个地方运行 linux,或者您可以在 linux 之上的某个地方提供该环境,但在任何一种情况下,当谈到 32 -bit-char 环境将其描述为“32 位 linux”是错误的。提问者说“32位linux”,这足以告诉我们char和char*的大小。