size_t和内存分配
size_t and memory allocation
有这样的 std::size_t
。它可用于描述对象的大小,因为它可以保证能够表达任何对象的最大大小(因此在此处写)。但是,这是什么意思?实际上,我们在内存中没有对象。因此,这是否意味着这种类型可以存储一个代表我们理论上可以使用最大内存的整数?
如果我尝试写
之类的东西size_t maxSize = std::numeric_limits<std::size_t>::max();
new char[maxSize];
我会遇到错误,因为数组的总大小限于0x7fffffff。为什么?此外,如果我传递了等于maxSize
的非恒定表达式,则将抛出std::bad_array_new_length
。如果我通过一个小于maxSize
但仍然大于0x7FFFFFFF的表达式,则将抛出std::bad_alloc
。我想std::bad_alloc
是由于缺乏内存而投掷的,而不是因为大小大于0x7ffffffff。为什么会这样?我想扔 special 例外,如果内存的大小,我们要分配的内容大于0x7ffffffff(这是传递给const的最大值编译时新[])。为什么只有通过maxSize
才能抛出std::bad_array_new_length
?这种情况特别吗?
顺便说一句,如果我将最大化传递给向量的构造函数:
vector<char> vec(maxSize);
std::bad_alloc
将被抛出,而不是std::bad_array_new_length
。这是否意味着向量使用不同的分配器?
我正在尝试自己实现阵列。使用未签名的INT来存储大小,容量和指数是一种不好的方法。因此,定义这样的别名是一个好主意:
typedef std::size_t size_type;
并使用size_type
代替unsigned int
?
答案在于创建动态存储持续时间的对象的过程中。
简短,当程序执行A new Expression 为: new char[size]
:
-
它检查
s=size*sizeof(char)+x
是否是有效的大小(实现定义的0x7ffffffff,取决于ABI)(如果您创建了琐碎的可破坏性类型的数组,则大多数平台上的x = 0)。如果大小无效,则会抛出bad_array_new_lenght
,否则, -
它调用分配函数
::operator new(s)
。此函数的第一个参数是std::size_t
,这就是为什么std::size_t
必须足够大才能创建任何大小的对象(数组是对象)。 -
此分配功能要求系统保留大小
s
的存储区域。如果系统成功保留此空间,它将返回一个指针到存储区域的开头。否则,它称为新处理程序和重试分配,但是如果再次失败,它将抛出bad_alloc
-
如果分配成功,则默认初始化(在这种情况下)
size
char
(no-op)在分配的存储中,它也可能存储此数组的大小分配的存储(原因是添加的x
)(在执行A delete表达式时使用这是为了知道必须如何调用许多破坏者的方式。如果驱动器很琐碎,这不是必需的))。
您将在C 标准中找到所有详细信息(第6.7.4条[BASIC.STC.DYNAMIC],§8.3[EXPR.NEW],§8.4[EXPR.DELETE],§21.6[support.dynamic])。
对于最后一个问题,您可以考虑使用签名的类型用于索引和对象大小。即使对象大小或索引不应该为负,该标准也强加了未签名的算术遵循的模量算术,从而限制了严重优化。此外,未签名的整数类型算术和比较是错误的经常受试者。std::size_t
出于兼容原因未签名,因为史前机器的碎屑短!(16位或更少!)
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配