美文网首页
面向对象编程与面向数据编程

面向对象编程与面向数据编程

作者: 谭英智 | 来源:发表于2023-10-23 21:57 被阅读0次

    背景

    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的利用率就可以非常高

    相关文章

      网友评论

          本文标题:面向对象编程与面向数据编程

          本文链接:https://www.haomeiwen.com/subject/twvjidtx.html