我有一个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]但我需要避免乘法速度限制。
答案 0 :(得分:1)
我有一个char *数据,我为了像这样访问它而
这就是你问题的根源。它是一个连续的内存块。如果您需要不同的界面,请写一个视图外观,或者......
我的问题是如何通过" arr"作为函数的参数?
最简单的方法是避免使用语言中留下的(可怕的)低级原语来实现C兼容性。
如果您在编译时不知道大小,请使用std::vector
。如果您知道,请使用std::array
。
但我需要避免速度限制的乘法。
除非你有基准数据来支持这一点,否则我认为这个要求是过早的优化。
答案 1 :(得分:1)
另外,我知道我可以像这样访问我的值:data [2 * size + 3]但我需要避免乘法速度限制。
以你提出的方式无法避免这种情况。如果您访问x[2][3]
之类的数据,您希望编译器做什么?它会将索引转换为等效的2 * size + 3
。如果这对你的问题来说太慢了,你运气不好,需要找到另一种方法来争取时间。你无法开展工作的建议解决方案不是解决方案,所以即使尝试它也毫无意义。
也许您可以更改代码以使用不同的访问模式,没有那么多需要所有这些乘法的复杂跳转?线性内存访问往往是最好的排序,因为它们利用了内存层次结构;也许你可以利用它?但是,如果不知道代码的作用,很难说你可以改变什么。