对象表示和运算符 sizeof 的定义

Posted

技术标签:

【中文标题】对象表示和运算符 sizeof 的定义【英文标题】:Definition fo object representation and operator sizeof 【发布时间】:2014-10-07 04:31:18 【问题描述】:

对象表示概念的定义在3.9/4中给出:

[基本类型]

类型 T 的对象的对象表示是 N 的序列 类型 T 的对象占用的 unsigned char 对象,其中 N 等于 sizeof(T).

但是sizeof操作符的定义如下:

[expr.sizeof]

sizeof 运算符产生 object 中的字节数 表示它的操作数。

特别是:

当应用于一个类时,结果是一个类中的字节数 该类的对象,包括放置所需的任何填充 数组中该类型的对象

我想通过例子来考虑这个定义:

struct A 
    int a;  //sizeof(a) is implementation defined
    long b; //sizeof(b) is implementation defined
    char c; //sizeof(c) is 1 by definition 
    // Padding, problbly equals to 3 butes

sizeof(A) 是如何通过实现计算的?我们只计算sizeof(a) + sizeof(b) + sizeof(c) + padding 的总和。

但是required for placingobjects of that type in an array的条件是什么?

【问题讨论】:

数组必须是连续的。对象需要正确对齐。 @T.C.所有类型的对象表示是否都期望 窄字符类型 由于 sizeof 而定义的实现是? @T.C.关于我在问题中定义的结构。这意味着实现添加的填充也是未定义的,对吧?那是添加到将结构对象存储到数组中的能力的填充可能足够大。我试着确定,但是 clang 和 gcc 都给出了相同的 sizeof。 【参考方案1】:

你简单地计算结构的大小:

long size = sizeof(struct A);  

如果你想要一个struct A 的数组,

struct A arr[/* Size of array */];

【讨论】:

以上是关于对象表示和运算符 sizeof 的定义的主要内容,如果未能解决你的问题,请参考以下文章

细说关键字sizeof及其十大特性

转移字符----sizeof & strlen

sizeof运算符

当 sizeof 的大小与实际对象大小不匹配时,一切如何工作(包括运算符'->')?

C语言中,sizeof运算符有啥作用?

sizeof(类)