我知道 malloc() 至少分配了所需的大小,因此它可以提供更多。问题是它会在相同架构中提供至少相同的内存大小吗?
例子:
int * myint = (int*)malloc(sizeof(int))
sizeof(myint) //---> this gives me 8
每次在我的电脑上都会给我8个吗?
如果你不这样做malloc
,它仍然会给你 8。因为它根本与 malloc 无关!
sizeof
是一个编译时常量,它告诉您存储参数类型的实例所需的大小。参数的类型是int *
并且您的编译器显然编译为 64 位,因此指针占用 8 个字节。
注意:在 C++ 中,sizeof
始终是编译时常量。在 C 中,对于可变长度数组有一种特殊情况,即返回数组的实际运行时大小。但是 C++ 没有可变长度数组,所以你不必为这种特殊情况而烦恼。
另一个注意事项:在 C++ 中,您应该使用vector
和其他集合,如果所有其他集合都失败了(不幸的是没有make_unique
)new
,但通常不是malloc
。
没有标准的方法可以准确地知道运行时在幕后保留了多少内存。甚至也没有一种标准方法可以找出您最初要求的金额。(如果你需要记住这一点,你需要自己存储它。)
给定的实现可能会保留您所要求的确切数量或更高的数量,并且可能会不时变化。但你不应该知道也不应该关心。
正如其他人指出的那样,在您的代码中,您实际上是在询问int*
指针的大小而不是分配块的大小。
sizeof
在给定的编译中将始终返回相同的值,因为它是编译时值(在运行程序时不确定。
但是请注意,例如,我的 64 位 ubuntu 机器也可以运行 32 位代码,并且某些类型的大小会根据我是要编译 32 位可执行文件(例如 with gcc -m32 ...
)还是 64 位可执行文件而改变。所以返回的值sizeof
可能取决于编译选项。
sizeof(myint)
然而,在您的代码中返回指针的大小,无法知道实际分配的内存块的实际大小(这是留给 malloc 实现的细节)。从返回的值中您所知道的(可移植的)malloc
是它有足够的内存(即不少于您要求的内存)并且可以用于存储任何基本类型(它尊重平台上最严格的对齐方式)。
这是因为您正在找出指针的大小而不是分配的内存的大小