当前位置: 首页 > 知识库问答 >
问题:

变量是大小为1的数组吗?

闻人树
2023-03-14

请考虑以下问题:

int main(int, char **) {
  int variable = 21;
  int array[1] = {21};
  using ArrayOf1Int = int[1];
  (*reinterpret_cast<ArrayOf1Int *>(&variable))[0] = 42;
  *reinterpret_cast<int *>(&array) = 42;
  return 0;
}

注意,我把这个标记为语言律师问题。因此,我对-fno-strict-aliasing或编译器的特定行为不感兴趣,而是对标准中所说的内容感兴趣。另外,我想知道这在C++03、C++11、C++14和较新的版本之间是否发生了变化,以及如何发生变化也是很有趣的。

共有1个答案

林项明
2023-03-14

显然,如果一个对象是大小为1的数组的变量,您可以用一个对象初始化对大小为1的数组的引用:

int variable{21};
int (&array)[1] = variable; // illegal

但是,初始化是非法的。与此相关的条款是第4条[conv](标准转换),该条款在第1段中规定:

标准转换是具有内置含义的隐式转换。草案第4条列举了这类转换的全部内容。

这个语句的存在还意味着数组对象和非数组对象是不同的实体:如果它们被认为是相同的,那么就没有必要首先使用这个语句。

关于标准的先前(或未来)版本:尽管不同子句中的确切单词可能发生了变化,但总体情况没有改变:对象和数组总是不同的实体,而且到目前为止,我还不知道是否打算改变这一点。

 类似资料:
  • 问题内容: 我正在尝试将固定大小的数组转换为可变大小的数组(切片): 但是编译器抛出错误: 我应该如何转换? 问题答案: 使用让您在阵列上切片。另请参阅此博客文章,以获取有关数组和切片的更多信息。

  • 问题内容: 我需要更改数组的大小,但是我不能简单地创建另一个数组- 它需要相同的名称,因此可以将其传递给方法。具体来说,我需要数组具有的术语数量是以前的两倍。这可能与一个数组有关吗?我可以将数据从数组A复制到数组B,然后在A = B时使A引用与B相同的数据吗?? 问题答案: 是的,您的数组变量可以引用相同类型但大小不同的数组。 对于内部更改,ArrayList可能更易于使用。

  • 问题内容: 我继承了一些Python代码,这些代码用于创建巨大的表(最多19列,每行5000行)。花了 九秒钟 时间在屏幕上绘制了表格。我注意到每一行都是使用以下代码添加的: 字符串在哪里。 我将其更改为: 我注意到桌子现在出现了 六秒 。 然后我将其更改为: 基于这些Python性能提示(仍为6秒)。 由于调用了大约5000次,因此突出了性能问题。但是为什么会有如此大的差异呢?为什么编译器没有在

  • 问题内容: 在Linux上的环境变量中可以存储的数据量是否有限制,如果可以,它是什么? 对于Windows,我发现以下KB文章总结为:Windows XP或更高版本:8191个字符Windows 2000 / NT 4.0:2047个字符 问题答案: 我认为Linux上没有针对每个环境的变量限制。所有环境变量的总大小在execve()时受到限制。有关更多信息,请参见此处的“参数和环境大小的限制”

  • null 请在此基础上向我澄清。谢谢你的合作。

  • 问题内容: 我有一个看起来像这样的表: 我想做的是返回一组行,其中值按’val’分组,并带有fkeys数组,但仅在fkeys数组大于1的情况下。因此,在上面的示例中,返回值将是看起来像: 我有以下查询聚合数组: 但这返回类似: 最好的方法是什么?我猜可能是将现有查询用作子查询,并对它进行求和/计数,但这似乎效率很低。任何反馈都将真正有帮助! 问题答案: Use子句过滤具有以下内容的组