什么是最合适的结构大小的方法

时间:2013-04-29 12:37:02

标签: c struct sizeof

我在C中看到了3种不同的结构大小的方法。

typedef struct A {
    int a, b;
} A;


sizeof(A); // method 1

sizeof(struct A); // method 2

A *p; 
sizeof(*p); // method 3

哪一个是最合适的方法?考虑效率和可读性。

4 个答案:

答案 0 :(得分:8)

除了使用可变长度数组外,sizeof是100%编译时。因此,除了可读性,可理解性,安全性等方面的间接性之外,没有“效率”。

我赞成重复次数最少的版本,并且输入次数最少。因此,如果指针可用,我总是使用第三种形式,但没有括号,因为它们不需要。

例如:

float *a = malloc(1000 * sizeof *a);

请注意,像这样的代码会将sizeof“锁定”到正在使用的指针,这至少要好一点(我认为它要好得多,因为典型的函数在范围上的指针少于它们的指针类型名称),而不是重复类型,因为不匹配的风险相应减少。

仅当参数是类型名称时,才需要像sizeof(float)sizeof(A)这样的代码中的括号。因为它使它看起来像一个函数调用,它不是,当我必须使用该表单时,我总是用空格格式化它:

void *p = malloc(1000 * sizeof (float));

请记住 sizeof不是函数

答案 1 :(得分:1)

sizeof在编译时(*)进行评估,因此它们都同样有效。

你的其余问题是关于编码风格。

有两个阵营在争论是否使用typedef作为结构。一个阵营(最着名的是Linux内核人员)认为struct Atypedef更清晰。另一个阵营(除了Linux人员之外几乎所有人)认为typedef更清楚。这些是主观意见,没有共识,没有对错。两种形式都没问题。

然后还有另一种关于sizeof(type_of_ptr)sizeof(*ptr)是否更清晰的编码风格辩论。同样,没有达成共识,这是主观的编码风格。

因此,您的问题的答案是:它取决于您的编码风格标准。一种形式,你的编码标准决定你当前的项目。


(*)除了VLAs的大小

答案 2 :(得分:0)

这里的typedef毫无意义,并且模糊了你错过了sizeof的重要用法这一事实。我假装你没有使用typedef,而是要求获取变量的大小。例如,您有一个名为A的{​​{1}}类型的变量。

就可读性而言,这完全取决于背景(和个人偏好)。分配内存时,使用3:

更具可读性
struct A

当试图确定结构的大小时,最好使用2(尽管这是一个非常人为的例子,因为方法2几乎不可取):

p = malloc( sizeof *p );

如果您想知道变量的大小,请使用方法1:

char *ptr;  /* eventually points to an array of struct A */
ptr += sizeof( struct A );

在实践中,方法3几乎总是优选的。 (这是个人意见陈述。)

我做空,确定你计算尺寸的原因。这将推动“可读”的定义。

答案 3 :(得分:0)

当使用sizeof运算符来评估静态声明的数组的大小时,您可以用一种奇特的方式执行此操作 - sizeof(some_type[some_size])

所以,假设您有一些自定义类型:

struct some_struct {
        int some_int;
};

然后,在最简单的可编译引物中,你可以使用这样的东西:

#define PREFERABLE_SIZE 1000

int main(const int argc, const char *argv[static const 1])
{
        return sizeof(struct some_struct[PREFERABLE_SIZE]);
        /* Or you may do this with some base type (i.e, float) */
        /* return sizeof(float[PREFERABLE_SIZE]); */
}

sizeof(some_type[some_size])相当于some_size * sizeof(some_type)。至于我,前者比后者更优选和“更漂亮”。