sizeof 是做啥的?

Posted

技术标签:

【中文标题】sizeof 是做啥的?【英文标题】:What does sizeof do?sizeof 是做什么的? 【发布时间】:2010-07-08 11:46:03 【问题描述】:

sizeof的主要功能是什么(我是C++新手)。比如

int k=7;
char t='Z';

sizeof (k)sizeof (int)sizeof (char) 是什么意思?

【问题讨论】:

您的字符中缺少一个 '。 @Tyler McHenry Timing 在 0.08 秒时对我来说有点离谱。 @davit:如果你要学习一门编程语言,你真的应该尝试阅读一本体面的关于该语言的入门书籍以了解基础知识,而不仅仅是让其反复试验、错误、猜测和无休止关于 SO 的问题。 当我用谷歌搜索一个问题时,它总是让我很开心,而且第一个链接是这样的,有人因为提问而不是谷歌搜索而受到谴责! :) 我投票结束这个问题作为离题,因为这个问题根本没有显示任何努力。 【参考方案1】:

sizeof(x) 返回变量或类型x 占用的内存量(以字节为单位)。它与变量的值无关。

例如,如果您有一个任意类型的数组T,那么该数组元素之间的距离正好是sizeof(T)

int a[10];
assert(&(a[0]) + sizeof(int) == &(a[1]));

在变量上使用时,相当于在该变量的类型上使用:

T x;
assert(sizeof(T) == sizeof(x));

根据经验,最好尽可能使用变量名,以防类型发生变化:

int x;
std::cout << "x uses " << sizeof(x) << " bytes." << std::endl
// If x is changed to a char, then the statement doesn't need to be changed.
// If we used sizeof(int) instead, we would need to change 2 lines of code
// instead of one.

当用于用户定义的类型时,sizeof 仍然返回该类型的实例使用的内存量,但值得指出的是,这不一定等于其成员的总和。

struct Foo  int a; char b; ;

虽然sizeof(int) + sizeof(char) 通常是5,但在许多机器上,sizeof(Foo) 可能是8,因为编译器需要pad out 结构使其位于4 字节边界上。情况并非总是如此,很有可能在您的机器上sizeof(Foo) 将是 5,但您不能依赖它。

【讨论】:

int 表示如果变量 t 给定 t=100 而不是 sizeof(t)= 1? sizeof 与变量的无关。它与类型有关。它告诉您,在您的系统上,int 类型的所有变量都需要 4 个字节的存储空间。 它显示 4 因为int 通常使用 4 个字节。 sizeof与变量中存储的值无关。 nit:从技术上讲,sizeof 不报告以字节为单位的大小,而是以任何必要的单位来报告 sizeof(char) == 1。这几乎是普遍的字节,但至少在理论上,不一定。 来自标准:“sizeof 运算符在其操作数的对象表示中产生字节数。”但是,您是对的,标准中的字节没有像通常那样明确定义为 8 位。【参考方案2】:

补充彼得亚历山大的答案: sizeof 产生一个值或类型的大小,是 char---char 的大小的倍数,被定义为可寻址的最小内存单元(通过 C 或 C++)对于给定的架构(并且,至少在 C++ 中,根据标准,大小至少为 8 位)。这就是通常所说的“字节”(给定架构的最小可寻址单元)的含义,但澄清一下也无妨,而且偶尔会有关于sizeof (char) 可变性的问题,当然总是1

【讨论】:

字节不一定是“给定架构的最小可寻址单元”。在某些 CDC Cyber​​ 计算机上,最小的可寻址单元是 16 位字(地址 0 是 16 位,地址 1 是不同的 16 位),它们将两半称为字节。 @James:对:我的意思是“字节”是一个固有的模棱两可的术语,无论你如何定义它,某个地方的人都会以不同的方式使用它。对 CDC 很感兴趣。 大多数人会同意一个字节是 8 位,虽然过去有些混乱,但现在它已标准化:IEC 80000-13。相比之下,机器中最小的可寻址单元通常称为字,它与机器相关。有 16 位、32 位、64 位架构,但即使在这些情况下,一个字节仍然是 8 位。【参考方案3】:

sizeof() 返回传递给它的参数的大小。 sizeof() cpp reference

【讨论】:

sizeof() 操作的效率如何?如果我在数百个地方调用sizeof(),会不会很慢,我应该将它存储在变量中吗? int LONG_SIZE = sizeof(long); 之类的东西? sizeof() 是编译时间,因此它是您可以获得的最佳性能,因为在运行时这只是代码中的一个常数。【参考方案4】:

sizeof 是一个编译时一元运算符,它返回数据类型的大小。 例如:

sizeof(int)

将以字节为单位返回int 的大小。

还要记住,类型大小取决于平台。

查看此页面了解更多详情:sizeof in C/C++

【讨论】:

以上是关于sizeof 是做啥的?的主要内容,如果未能解决你的问题,请参考以下文章

LoaderManager 是做啥的?

FragmentManager 和 FragmentTransaction 到底是做啥的?

这段代码是做啥的? [关闭]

CSS:这个星号 (*) 是做啥的?

真正的“统计”是做啥的?

框架布局是做啥的?