背景
C++的设计具备面向对象的思想
通过面向对象的抽象,可以很好解耦和扩展。
然而对于某些高性能设计,面向对象并不是很好的设计
而面向数据的思想在某种程度,解决了高性能的问题。
场景
面向对象设计
-
类定义
class Point { int x; int y; };
-
使用场景
std::vector<Point> arr; int z = 0; for(auto& p: arr) { z += p.x; }
-
变量arr的内存分布如下
| x | y | x | y | x | y | x | y | x | y | x | y |
由于对象Point使用时,是累加成员x,在数据的内存分布来看,每次访问下一个x,都需要在内存中跳过y,导致CPU cache的数据有一半是浪费的。
这让人思考是否面向对象的设计适合这种场景
面向数据设计
-
数据定义
class PointContainer { std::vector<int> x_arr; std::vector<int> y_arr; };
-
使用
PointContainer p; int z = 0; for(auto& x: p.x_arr) { z += x; }
-
内存分布
| x | x | x | x | x | x | x | x | x | x | x |
通过面向数据思想的改造,x的内存分布是紧密的,这样在计算 z 的时候,CPU cache的利用率就可以非常高
网友评论