【问题标题】:Casting between multi- and single-dimentional arrays在多维和一维数组之间进行转换
【发布时间】:2010-09-08 12:07:01
【问题描述】:

这来自this answer to a previous question of mine。 是否保证编译器将array[4][4]array[16] 同等对待?

例如,以下对api_func() 的调用是否安全?

void api_func(const double matrix[4][4]);

// ...

{
  typedef double Matrix[4][4];

  double* array1 = new double[16];
  double array2[16];

  // ...

  api_func(reinterpret_cast<Matrix&>(array1));
  api_func(reinterpret_cast<Matrix&>(array2));
}

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    来自 C++ 标准,指的是sizeof 运算符:

    当应用于数组时,结果是数组中的总字节数。这意味着n 元素数组的大小是n 乘以元素的大小。

    据此,我想说double[4][4]double[16] 必须具有相同的底层表示。

    即,给定

    sizeof(double[4]) = 4*sizeof(double)
    

    sizeof(double[4][4]) = 4*sizeof(double[4])
    

    那么我们有

    sizeof(double[4][4]) = 4*4*sizeof(double) = 16*sizeof(double) = sizeof(double[16])
    

    我认为符合标准的编译器必须同样实现这些,而且我认为这不是编译器会意外破坏的东西。实现多维数组的标准方法按预期工作。打破标准需要额外的工作,可能没有任何好处。

    C++ 标准还规定,数组由连续分配的元素组成,这消除了使用指针和填充做任何奇怪事情的可能性。

    【讨论】:

      【解决方案2】:

      我认为通过多维数组引入的填充没有问题。

      数组中的每个元素都必须满足架构强加的填充要求。数组 [N][M] 在内存中的表示总是与 [M*N] 之一相同。

      【讨论】:

        【解决方案3】:

        每个数组元素都应由编译器按顺序排列在内存中。这两个声明虽然不同的类型是相同的底层内存结构。

        【讨论】:

          【解决方案4】:

          @康拉德鲁道夫:

          我自己把这两个(行专业/列专业)搞混了,但我知道这一点:定义明确。

          例如,int x[3][5] 是一个大小为 3 的数组,其元素是大小为 5 的 int 数组。(§6.5.2.1)添加标准中关于数组、寻址等的所有规则. 你知道第二个下标引用连续的整数,而第一个下标将引用连续的 5-int 对象。 (所以 3 是更大的数字;x[1][0] 和 x[2][0] 之间有 5 个整数。)

          【讨论】:

            【解决方案5】:

            我担心会为 Matrix[5][5] 之类的内容添加填充以使每行单词对齐,但这可能只是我自己的迷信。

            【讨论】:

              【解决方案6】:

              一个更大的问题是:你真的需要进行这样的演员阵容吗?

              尽管您可能能够摆脱它,但完全避免它仍然会更具可读性和可维护性。例如,您可以始终使用 double[m*n] 作为实际类型,然后使用包装此类型的类,并可能重载 [] 运算符以方便使用。在这种情况下,您可能还需要一个中间类来封装单行——这样 my_matrix[3][5] 之类的代码仍然可以按预期工作。

              【讨论】:

                猜你喜欢
                • 2023-03-26
                • 2019-06-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-11-25
                相关资源
                最近更新 更多