【问题标题】:Can a C++ object be stored at the highest memory-location?C++ 对象可以存储在最高的内存位置吗?
【发布时间】:2014-11-16 23:27:52
【问题描述】:

最高内存位置(可能是(void*)(std::uintptr_t)-1)是否是存储 C++ 对象的有效地址?

【问题讨论】:

  • .begin().end() 是迭代器,它们与 size_t 没有任何关系(必然)
  • "小于"表示"调用重载函数vector::iterator::operator<",这可能知道最后一个元素在最高内存地址的可能性并返回正确的结果
  • 这是vector 与其他容器不同的问题;矢量需要将元素存储在连续的内存中,而其他则不需要
  • @Matt McNabb 说得好,谢谢
  • 在什么意义上size_t max ((size_t)-1) 是一个内存位置,而不是size_t 类型的对象,其初始值可能不相关? size_t 类型的值是一个整数值,而不是指针或地址。

标签: c++ arrays pointers object byte


【解决方案1】:

vect.end() 永远不会小于vect.begin()。如果vect.empty(),它们是相等的。

(void*)(uintptr_t)-1(通常与(void*)(size_t)-1相同)指向虚拟内存的最大可寻址字节。根据架构和环境,它可以是有效或无效的内存位置。

向量的最后一个元素 (*(vect.end() - 1)) 可以驻留在最大的虚拟内存地址上。

【讨论】:

  • 那么向量的最后一个元素不能永远驻留在最高内存地址吗?
  • @jayjay 请注意,.end() 确实指向vector 中的最后一个元素,它指向vector 的末尾
  • @pts:你确定会指向那里吗?那保证在哪里?
  • size_t 不能保证索引所有内存,uintptr_t 是。 size_t 仅指定将所有可能的字节索引存储到每个对象中,因此可以小得多。
  • 您关于(void*)(uintptr_t)-1 的声明除其他外假定地址未签名。就语言而言,地址没有符号,仅仅是因为它们不是整数。
【解决方案2】:

绝对不能保证地址 -1 无效。但是,它是可能的最高地址。

当然,迭代器与有效内存地址或size_t 的值没有任何关系。只是他们使用operator<(iterator, iterator) 以理智的方式进行比较。当然,如果v.begin()-1,那么v.end() 不能高于v.begin(),因为根据定义,它是可以在机器中使用的最高地址——超过它的一个字节是0,它位于内存的最低地址。

我非常怀疑你是否真的可以设计出这样的情况,但从技术上讲,假设迭代器实际上是作为指针实现的,如果你有vector<char>,并设法在-1 分配一个指针,那么v.end()实际上会为零。但是,您真的必须处理它,因为该内存通常是为内核空间保留的(并且可能受操作系统保护以检测“NULL 指针对象的负偏移量”)。

因此,虽然不能保证这不会发生,但在实践中,系统的设计几乎可以肯定它不会发生。

根据重新制定的问题进行编辑:

C++ 标准不排除使用最高可用地址。但就像上面的文字所说,你必须非常努力地在基于现代处理器并具有现代操作系统(Linux、Windows 等)的系统中实际使用它,因为内存范围保留给捕获“错误的 NULL 指针访问”。

【讨论】:

  • 你确定任何旧的迭代器是LessThanComparable
  • 嗯,从技术上讲,他们没有,但是当他们没有时,这有点不切实际......
  • 除 RandomAccessIterators are only EqualityComparable` 之外的所有内容,并不意味着没有用。
猜你喜欢
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2020-06-01
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多