1

我在 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

4 回答 4

8

除非使用可变长度数组,否则sizeof是 100% 编译时间。所以没有“效率”,除了在可读性、可理解性、安全性等方面的间接性。

我喜欢重复最少、打字最少的版本。因此,如果指针可用,我总是使用第三种形式,但没有括号,因为它们不需要。

例如:

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

请注意,像这样的代码“锁定”sizeof到正在使用的指针,这至少比重复类型要好一些(我认为这要好得多,因为典型函数在范围内的指针比它们的类型名称少)错配的风险相应降低。

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

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

请记住,这sizeof不是函数

于 2013-04-29T12:42:08.387 回答
1

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

你剩下的问题是关于编码风格的。

有两个阵营争论是否将 typedef 用于结构。一个阵营(尤其是 Linux 内核人士)认为这struct Atypedef. 另一个阵营(几乎所有人,除了 Linux 人)认为这typedef更清楚。这些都是主观意见,没有共识,没有对错。任何一种形式都可以。

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

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


(*) 除了 sizeof VLA

于 2013-04-29T12:58:45.700 回答
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)。至于我,前者比后者更可取和“漂亮”。

于 2013-04-29T13:37:19.467 回答
0

这里的 typedef 毫无意义,并且混淆了您错过了 sizeof 的重要用途的事实。我会假装您没有使用 typedef,而是询问有关变量大小的问题。例如,您有一个名为Atype的变量struct A

就可读性而言,这完全取决于上下文(和个人喜好)。分配内存时,使用3更易读:

p = malloc( sizeof *p );

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

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

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

void *ptr = malloc( COUNT * sizeof A );

在实践中,几乎总是首选方法 3。(这是个人观点的陈述。)

我简短地说,确定你为什么要计算大小。这将推动“可读”的定义。

于 2013-04-29T12:54:40.630 回答