如何将可变大小的指针数组作为参数传递给函数

时间:2015-06-16 10:23:58

标签: c++ arrays

我有一个char *数据,我为了像这样访问它而

arr[2][3]

我继续这样做:

char (*arr)[size] = (char (*)[size])data;

我的问题是如何通过" arr"作为函数的参数?

void func(??? arr)
{
   ...
}

void test(char *data, int size)
{
   char (*arr)[size] = (char (*)[size])data;
   func(arr);
}

我不知道" size"的价值。在编译时。

另外,我知道我可以像这样访问我的值:data [2 * size + 3]但我需要避免乘法速度限制。

2 个答案:

答案 0 :(得分:1)

  

我有一个char *数据,我为了像这样访问它而

这就是你问题的根源。它是一个连续的内存块。如果您需要不同的界面,请写一个视图外观,或者......

  

我的问题是如何通过" arr"作为函数的参数?

最简单的方法是避免使用语言中留下的(可怕的)低级原语来实现C兼容性。

如果您在编译时不知道大小,请使用std::vector。如果您知道,请使用std::array

  

但我需要避免速度限制的乘法。

除非你有基准数据来支持这一点,否则我认为这个要求是过早的优化。

答案 1 :(得分:1)

  

另外,我知道我可以像这样访问我的值:data [2 * size + 3]但我需要避免乘法速度限制。

以你提出的方式无法避免这种情况。如果您访问x[2][3]之类的数据,您希望编译器做什么?它会将索引转换为等效的2 * size + 3。如果这对你的问题来说太慢了,你运气不好,需要找到另一种方法来争取时间。你无法开展工作的建议解决方案不是解决方案,所以即使尝试它也毫无意义。

也许您可以更改代码以使用不同的访问模式,没有那么多需要所有这些乘法的复杂跳转?线性内存访问往往是最好的排序,因为它们利用了内存层次结构;也许你可以利用它?但是,如果不知道代码的作用,很难说你可以改变什么。