【问题标题】:Is it ok to pass &my_boost_array_variable[2] into a C function expecting a void*?可以将 &my_boost_array_variable[2] 传递给期望 void* 的 C 函数吗?
【发布时间】:2012-11-17 08:52:30
【问题描述】:

我有两个变量:

boost::array my_boost_array_variable_1<float, 3>;
boost::array my_boost_array_variable_2<float, 3>;

现在我想调用具有以下签名的 C 函数:

int MPI_Allreduce ( void *sendbuf, void *recvbuf, ...);

我想将我的my_boost_array_variable_1my_boost_array_variable_2 的特定元素的地址作为MPI_Allreduce 的第一个和第二个参数传递:

MPI_Allreduce(&my_boost_array_variable_1[2],
              &my_boost_array_variable_2[2], ...

或者我应该这样做:

MPI_Allreduce(my_boost_array_variable_1.c_array() + 2,
              my_boost_array_variable_2.c_array() + 2, ...

更新: C 函数需要一个连续的数据块,从 void *sendbuf 开始。这里的问题是这两个调用在这方面是否正确。 &my_boost_array_variable_1[2] 是否指向与 my_boost_array_variable_1.c_array() + 2 相同的位置?这些调用是否等效?

【问题讨论】:

    标签: c++ c arrays boost parameter-passing


    【解决方案1】:

    对我来说,第一个比第二个更清楚。但实际上我认为他们是平等的。

    【讨论】:

      【解决方案2】:

      根据http://www.boost.org/doc/libs/1_52_0/doc/html/boost/array.html 任何版本都不会抛出。 (不能以我的小名声发表评论:-))

      【讨论】:

        【解决方案3】:

        取决于系统,哪个更快,您可以自己查看汇编代码。

        第一种方法更安全,因为如果您尝试处理不合法的索引,它会抛出异常。

        第二种方法通常更快,因为您只有一个取消引用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-15
          • 1970-01-01
          • 1970-01-01
          • 2010-10-18
          • 1970-01-01
          • 2016-06-01
          • 2014-04-28
          • 1970-01-01
          相关资源
          最近更新 更多