对象宏的最大大小

Maximum size of object macro

我试着写了以下内容:

#include <stdint.h>
#include <stdlib.h>

void *ptr = malloc(SIZE_MAX);

但是编译器给了我以下警告:

warning: argument 1 value ‘18446744073709551615’ exceeds maximum object 
size 9223372036854775807 [-Walloc-size-larger-than=]

听起来很有道理。但无论如何,我想在当前 implementation/arch 上分配一个最大可能大小的对象。在 Annex.B(19):

中定义了宏 RSIZE_MAX
__STDC_WANT_LIB_EXT1__
RSIZE_MAX

所以我尝试了以下 example:

#define __STDC_WANT_LIB_EXT1__
#include <stdint.h>
#include <stdlib.h>

int main(){
    void *ptr = malloc(RSIZE_MAX);
}

但是没有效果,RSIZE_MAX没有定义。如何使用此宏或任何其他方式在编译时验证最大对象大小?

defineSIZE_MAX定义数据类型size_t的最大值。数据类型 size_t 能够存储任何对象的大小。最大大小取决于总线,例如 32 位或 64 位。

如果您尝试分配最大可数内存大小的内存,它一定会失败,因为这会阻塞您的整个地址 space。编译器会警告您 malloc 调用将始终失败。请求的大小没有意义。

顺便说一句:9223372036854775807 是 0x7FFFFFFFFFFFFFFFF

RSIZE_MAX在C11 Annex K中定义,可选。支持它的实现将预定义宏 __STDC_LIB_EXT1__。例如,我在 Ubuntu 系统上使用的 gcc/glibc 实现不支持它,因此没有定义 RSIZE_MAX.

在任何情况下,都不能保证 malloc(RSIZE_MAX) 会成功,标准中也没有任何暗示 RSIZE_MAX,即使已定义,也是 [= 支持的最大分配大小15=]。评估 malloc(RSIZE_MAX+1) 甚至不是 运行时约束违规 malloc() 仍然采用 size_t 类型的参数,而不是 rsize_tmalloc 通过返回空指针报告失败。

参见 N1570 K.3.4:

The macro is

RSIZE_MAX

which expands to a value of type size_t. Functions that have parameters of type rsize_t consider it a runtime-constraint violation if the values of those parameters are greater than RSIZE_MAX.

请注意,在某些系统上(特别是基于 Linux 的系统),即使没有足够的内存可供分配。参见 "overcommit" 和 "OOM killer"。