使用sizeof而不是literal

时间:2015-03-19 17:54:16

标签: c++ c

每当我在其他人的代码中看到malloc时,它通常会使用sizeof(short)sizeof(double)等来帮助定义要分配的内存大小。在这两个示例中,为什么他们不只是用28替换这些表达式?

3 个答案:

答案 0 :(得分:5)

它使代码更容易移植。

通常,有一些编译器选项可以让您说明如何在结构中对数据进行分配。双人的大小可能因平台而异。 通过一致地使用数据类型,可以减少某些类型的大小不匹配错误的发生。

我认为使用变量名而不是数据类型作为片段大小是一种更好的做法。

float Pi = 3.14f;

float *pieArray = (float *) malloc(sizeof (Pi) * 1000);

我个人更喜欢这种方法。

typedef float Pi;

Pi *piArray = new Pi[1000];

// use it

delete[] piArray;
在大多数情况下,

新/删除应优先于 malloc / free

答案 1 :(得分:1)

在C中编写malloc调用的最便携和可维护的方法是:

T *p = malloc( N * sizeof *p );

T *p;
...
p = malloc( N * sizeof *p );

其中T是任意类型,N是您要分配的该类型的对象的数量。跨平台的类型大小不统一,并且相应的语言标准仅强制非char类型必须能够表示的最小值范围。例如,int必须表示至少范围[-32767...32767],这意味着它必须至少 16位宽,尽管它可能是(而且往往更广泛。再举一个例子,struct类型可能在成员之间具有不同的填充量,具体取决于平台的对齐要求,因此struct foo类型可能在一个平台上占用24个字节而在另一个平台上占用32个字节。

表达式*p的类型为T,因此sizeof *p提供的结果与sizeof (T)相同,后者是存储{{1}类对象所需的字节数1}}。这将始终为您提供正确的字节数来存储您的对象(或对象序列),无论平台如何,如果您更改T(从T更改为int,例如),您不必返回并更改long电话的参数。

请注意,您不应在C ++代码中使用mallocmalloc;你应该使用像callocvector这样的标准容器来处理所有的内存管理。如果由于某种原因标准容器不能满足您的需求,请使用map运算符分配类型newT的单个对象以分配对象数组。

答案 2 :(得分:0)

c ++标准不能修正double或short的大小。请注意,对于double,它甚至不必是IEEE754浮点类型。在这方面,c ++与Java不同。因此,硬编码大小是一个糟糕的主意。

在C ++中使用new / new[]delete / delete[]