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