2012-02-06 135 views
1

如果执行速度是重要的,应该使用这一点,2D阵列与结构(C++)

struct myType { 

    float dim[3]; 
}; 

myType arr[size]; 

,或者使用2D阵列作为arr[size][index]

+2

为什么你认为会有什么区别?你是否按照特定的配置对它进行了计时? – 2012-02-06 21:00:13

+1

这可能没关系。但是,如果速度对你很重要,*测量*目标平台上的两种方法。 – 2012-02-06 21:00:32

+1

如果速度很重要,请编写最易维护的代码,并让编译器为您优化它。 (除非你进行了基准测试,并发现了一个瓶颈,当然,这是该规则例外的唯一良好借口。) – 2012-02-06 21:01:18

回答

1

这取决于您的使用情况。如果你通常一起使用这三个维度,那么struct组织可能是合理的。尤其是当单独使用维度时,阵列布局最有可能带来更好的性能:当代处理器不仅仅加载单个单词,而是加载缓存行单元。如果仅使用部分数据,则会加载未使用的单词。

并行处理也更容易获得阵列布局,例如,使用SIMD操作。这在一定程度上是不幸的,因为对象布局通常是不同的。实际上,你使用的阵列可能是相似的,但如果你改变了东西变成float array[3][size]事情变得不同了。

1

没有区别的。选择更可读的东西。

除非你正在一个奇怪的平台上工作,那么这两者的内存布局将是相同的 - 对于编译器来说,这是最重要的。

2

没关系。无论在几乎所有情况下,编译器都会生成完全相同的代码。唯一的区别是如果结构引发某种填充,但考虑到你有看起来不太可能的漂浮物。

1

唯一的区别是当你将某些东西传递给函数时。 当您使用数组解决方案时,您从不复制包含数组的数组,但仅传递数组地址。 如果在struct解决方案中没有显式传递结构地址,那么结构总是会被复制。

0

您可能想要将2d数组映射到1d。可能更容易缓存

1

需要注意的另一件事是另一张海报提到:如果昏暗在结构中总是有3的大小,但集合实际上代表“红色,绿色,蓝色”或“ X,Y,Z“或”汽车,卡车,小船“,从维修的角度来看,你最好把它们拆掉。也就是说,使用类似

typedef struct VEHICLES 
{ 
    float fCar; 
    float fTruck; 
    float fBoat; 
} Vehicles; 

这样,当你回来两年调试它,或者别人有来看待它,他们不会去猜测什么样暗淡[0],暗淡[1 ]和dim [2]指的是。