C++ 使用sizeof而不是literal

C++ 使用sizeof而不是literal,c++,c,C++,C,每当我在别人的代码中看到malloc时,它通常使用sizeof(short)或sizeof(double)等来帮助定义要分配的内存大小。为什么他们不能用“ 2”/代码>或 8 > /代码>替换这两个例子中的“< /p>< p>”,而不是用C++标准来固定一个双或短的大小。请注意,对于double,它甚至不必是IEEE754浮点类型。在这方面,C++与java不同。因此,硬编码尺寸是个糟糕的主意 和使用新< /C> > />代码>新[] < /COD>和删除< /C> > />代码> DELTET

每当我在别人的代码中看到
malloc
时,它通常使用
sizeof(short)
sizeof(double)
等来帮助定义要分配的内存大小。为什么他们不能用“<代码> 2”/代码>或<代码> 8 > /代码>替换这两个例子中的“< /p>< p>”,而不是用C++标准来固定一个双或短的大小。请注意,对于double,它甚至不必是IEEE754浮点类型。在这方面,C++与java不同。因此,硬编码尺寸是个糟糕的主意


<>和使用<代码>新< /C> > />代码>新[] < /COD>和<代码>删除< /C> > />代码> DELTET[< /C> > C++ >

< P>,不使用C++标准固定双或短的大小。请注意,对于double,它甚至不必是IEEE754浮点类型。在这方面,C++与java不同。因此,硬编码尺寸是个糟糕的主意


<>和使用<代码>新< /C> > />代码>新[] /<代码>和<代码>删除< />代码> />代码>删除[]/Cord> C++,

使代码更易于端口.

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

我认为对于工件的大小,使用变量名而不是数据类型是更好的做法

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。

它使代码更易于移植

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

我认为对于工件的大小,使用变量名而不是数据类型是更好的做法

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

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

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

其中,
T
是任意类型,
N
是要分配的该类型对象的数量。不同平台的类型大小并不一致,相应的语言标准只要求非字符类型必须能够表示的最小值范围。例如,
int
必须至少表示范围
[-32767…32767]
,这意味着它必须至少有16位宽,尽管它可能(通常)更宽。例如,根据平台的对齐要求,
struct
类型可能在成员之间具有不同的填充量,因此
struct foo
类型可能在一个平台上占用24字节,在另一个平台上占用32字节

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


<>注意,不应在C++代码中使用<代码> MalcC < /C>或<代码> CaloC您应该使用标准容器,如
vector
map
,为您处理所有内存管理。如果由于某种原因标准容器不能满足您的需要,请使用
new
操作符分配
t
类型的单个对象,并使用
new[]
分配对象数组

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

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

其中,
T
是任意类型,
N
是要分配的该类型对象的数量。不同平台的类型大小并不一致,相应的语言标准只要求非字符类型必须能够表示的最小值范围。例如,
int
必须至少表示范围
[-32767…32767]
,这意味着它必须至少有16位宽,尽管它可能(通常)更宽。例如,根据平台的对齐要求,
struct
类型可能在成员之间具有不同的填充量,因此
struct foo
类型可能在一个平台上占用24字节,在另一个平台上占用32字节

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


<>注意,不应在C++代码中使用<代码> MalcC < /C>或<代码> CaloC您应该使用标准容器,如
vector
map
,为您处理所有内存管理。如果由于某种原因标准容器不能满足您的需要,请使用
new
操作符分配
t
类型的单个对象,并使用
new[]
分配对象数组

因为类型的大小可以根据运行代码的平台而改变。标准仅保证最小尺寸。请参阅:可能会找到更好的副本。
sizeof(double)==64