【问题标题】:Is GCC's "void pointer arithmetic" deterministic?GCC 的“空指针算术”是确定性的吗?
【发布时间】:2016-11-24 09:37:17
【问题描述】:

我遇到了一个包含以下代码的 C++ 库:

void *data;
unsigned length;
...
addr = data + length

首先,使用 void* 算术 没有多大意义,因为编译器不会知道每个元素的“大小”是多少(这里有更好的解释: void * arithmetic)。

但是,由于我在代码中使用了该库并且它似乎可以工作,所以我想知道以下内容。这种行为是否具有确定性,因为所有 GCC 每次都会生成相同的代码?或者,GCC 会以启发式的方式对其进行优化吗?

【问题讨论】:

  • 这是一个 GCC 扩展,显然他们不会改变它的规范。 void 的大小将始终被视为 1。如果您打算使用另一个编译器......嗯......它是 UB(但 AFAIK 每个编译器都会为此发出至少一个警告)
  • @acraig5075:显然不是,这个问题在解释这个问题不是关于什么时甚至提到了“重复”。

标签: c++ pointers gcc


【解决方案1】:

void* 指针上的指针运算行为未定义

GCC 允许它作为非标准编译器扩展(本质上将 void* 视为 char* 用于指针运算)。

【讨论】:

  • 非标准编译器扩展模式下是什么意思?
猜你喜欢
  • 1970-01-01
  • 2021-02-15
  • 2021-11-09
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2015-03-05
相关资源
最近更新 更多