对象宏的最大大小
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_t
。 malloc
通过返回空指针报告失败。
参见 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"。
我试着写了以下内容:
#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_t
。 malloc
通过返回空指针报告失败。
参见 N1570 K.3.4:
The macro is
RSIZE_MAX
which expands to a value of type
size_t
. Functions that have parameters of typersize_t
consider it a runtime-constraint violation if the values of those parameters are greater thanRSIZE_MAX
.
请注意,在某些系统上(特别是基于 Linux 的系统),即使没有足够的内存可供分配。参见 "overcommit" 和 "OOM killer"。