【问题标题】:What is an idiomatic way to determine pointer limits in C++?在 C++ 中确定指针限制的惯用方法是什么?
【发布时间】:2011-03-16 14:28:51
【问题描述】:

我想在编译时知道指针类型的值范围。 limits.h 仅指定纯数字类型的最大值和最小值。我不希望使用硬编码的常量,也不想使用sizeof(foo*) 计算最大值。

【问题讨论】:

  • 解释您要解决的问题,而不是询问如何实施您选择的解决方案。我在这里闻到一股很刺鼻的味道。
  • 你想让编译器检测系统中有多少内存可用??
  • 除 NULL 外,指针中的实际值是不透明的。即使 NULL 也不能保证具有任何类型的位模式,只是它是唯一的。如果您只想了解 32 位与 64 位架构,编译器特定的 #defines 会告诉您。
  • re:Amardeep,一个模板化的 trie 容器类,根据用作其提供的键类型的标记的类型的最大值和最小值进行参数化。我想使用指针列表作为我的键类型,因此将指针作为令牌类型。为了完成参数化,我需要有效指针值的范围。
  • 为什么您不想使用 sizeof 计算最大值?

标签: c++ pointers limits


【解决方案1】:

我相信我会使用 intptr_t。它被定义为可以保存指针值的整数,因此 intptr_t 的最小/最大值应该起作用。

可能大于实际指针的值。但是根据您对只需要最小值/最大值的类的解释,我认为您不需要完全准确。

【讨论】:

  • 请注意,intptr_t 目前不是 C++ 的一部分;它在 C99 中被添加到 C 中,并将出现在即将到来的 C++0x 标准中。
【解决方案2】:

指针不是数字。特别是,它们不是绝对有序的——给定两个随机指针 pq,你不能从另一个指针中减去一个并得到有意义的结果——它是 UB,除非它们都指向同一个对象(malloc内存块、静态或自动对象等)。因此,允许的指针范围的概念在标准 C++ 中是没有意义的。

【讨论】:

  • 这是信息,但我不确定它是否密切相关。唯一进行的指针运算是比较,根据this answer,指向单独对象的指针可以安全且一致地与std::less<> 进行比较。据推测,如果有绝对排序,那么也有一个绝对范围。
  • 在这种情况下应用运算符<> 将同样未定义。但这是关于std::less 的一个好点,实际上——尽管它不必根据指针的< 来定义(标准对此相当清楚)——它仍然定义了一个绝对顺序,因此,一个范围。不过,它不必映射到实际地址,而且我很确定如果不枚举它们,就无法找出最小值和最大值(以std::less 表示)。
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2022-01-21
  • 2016-11-13
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多