多维数组结构的C对齐 | 珊瑚贝

C++ alignment of multidimensional array structure


在我的代码中,我必须考虑一个数组数组,其中内部数组是固定维度的。为了利用 STL 算法,将数据实际存储为数组数组很有用,但我还需要将该数据传递给 C 库,该库采用扁平 C 样式数组。

如果能够以可移植的方式廉价地转换(即展平)多维数组,那就太好了。我会坚持一个非常简单的案例,真正的问题更笼统。

1
2
struct my_inner_array { int data[3]; };
std::vector<my_inner_array> x(15);

1
&(x[0].data[0])

指向大小为 45*sizeof(int) 的连续内存块的指针,其中包含与 x 相同的条目?还是我必须担心对齐?恐怕这对我有用(至少对于某些数据类型和内部数组大小),但它不可移植。

  • 此代码是否可移植?
  • 如果没有,有没有办法让它工作?
  • 如果没有,您对我能做什么有什么建议吗?
  • 如果 my_inner_array 不是 POD 结构,但包含一些方法(只要该类不包含任何虚拟方法),它是否会改变任何东西?
    • 首先使用如此大的扁平数组并在适当的地方传递 [p, p stride) 块是否合适?标准算法强调抽象它们是对整个数组还是部分数组进行操作。
    • @LucDanton:例如,我想将一个函数应用于顶点数组。我想使用 std::transform(coord.begin(), coord.end(), values.begin(), f);其中 f 是 std::function<double (my_inner_array const
    • 1 理论上没有。编译器可能决定向 my_inner_array 添加填充。在实践中,我看不出编译器会向其中包含数组的结构添加填充的原因。在这种情况下,创建此类结构的数组不存在对齐问题。您可以使用编译时断言:

      1
      2
      typedef int my_inner_array_array[3];
      BOOST_STATIC_ASSERT(sizeof(my_inner_array) == sizeof(my_inner_array_array));

      4 如果没有虚拟方法,它不应该有任何区别。

    • 1 理论上没有。编译器可能决定向 my_inner_array 添加填充。在实践中,我看不出编译器会向其中包含数组的结构添加填充的原因。在这种情况下,创建此类结构的数组不存在对齐问题。您可以使用编译时断言:

      1
      2
      typedef int my_inner_array_array[3];
      BOOST_STATIC_ASSERT(sizeof(my_inner_array) == sizeof(my_inner_array_array));

      4 如果没有虚拟方法,它不应该有任何区别。


    1 理论上没有。编译器可能决定向 my_inner_array 添加填充。在实践中,我看不出编译器会向其中包含数组的结构添加填充的原因。在这种情况下,创建此类结构的数组不存在对齐问题。您可以使用编译时断言:

    1
    2
    typedef int my_inner_array_array[3];
    BOOST_STATIC_ASSERT(sizeof(my_inner_array) == sizeof(my_inner_array_array));

    4 如果没有虚拟方法,它不应该有任何区别。


    来源:https://www.codenong.com/10104190/

    微信公众号
    手机浏览(小程序)

    Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

    Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

    Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9608.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
    0
    分享到:
    没有账号? 忘记密码?