每当我在其他人的代码中看到malloc
时,它通常会使用sizeof(short)
或sizeof(double)
等来帮助定义要分配的内存大小。在这两个示例中,为什么他们不只是用2
或8
替换这些表达式?
答案 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 ++代码中使用malloc
或malloc
;你应该使用像calloc
或vector
这样的标准容器来处理所有的内存管理。如果由于某种原因标准容器不能满足您的需求,请使用map
运算符分配类型new
和T
的单个对象以分配对象数组。
答案 2 :(得分:0)
c ++标准不能修正double或short的大小。请注意,对于double,它甚至不必是IEEE754浮点类型。在这方面,c ++与Java不同。因此,硬编码大小是一个糟糕的主意。
在C ++中使用new
/ new[]
和delete
/ delete[]
。