当前位置:首页 » 编程软件 » 面向数据编程

面向数据编程

发布时间: 2024-12-18 12:57:30

1. 面向对象编程有哪些问题

1. 过度封装

使用OOP时,会把一些复杂的问题分拆抽象成较简单的独立对象,通过对象的互相调用去实现方案。但是,由于对象包含自己封装的数据,一个问题的数据集会被分散在不同的内存区域。互相调用时很可能会出现数据的cache miss的情况。

2. 多态

在C++的一般的多态实现中,会使用到虚函数表。虚函数表是通过加入一次间接层来实现动态派送。但在调用的时候需要读取虚函数表,增加cache miss的可能性。基本上要支持动态派送,无论用虚函数表、函数指针都会形成这个问题,但如果类的数目极多,把函数指针如果和数据放在一起有时候可放缓问题。

3. 数据布局

虽然OOP本身并无限制数据的布局方式,但基本上绝大部分OOP语言都是把成员变量连续包裹在一段内存中。甚至使用C去编程的时候,也通常会使用到OOP或Object-based的思考方式,把一些相关的数据放置于一个struct之内:

structParticle{
Vector3position;
Vector4velocity;
Vector4color;
floatage;
//...
};


即使不使用多态,我们几乎不加思索地会使用这种数据布局方式。我们通常会以为,由于各个成员变量都紧凑地放置在一起,这种数据布局通常对缓存友好。然而,实际上,我们需要考虑数据的存取模式(access pattern)。

在OOP中,通过封装,一个类的各种功能会被实现为多个成员函数,而每个成员函数实际上可能只会存取少量的成员变量。这可能形式非常严重的问题,例如:

for(Particle*p=begin;p!=end;++p)
p->position+=p->velocity*dt;//或p->SimulateMotion(dt);

在这种模式下,实阶上只存取了两个成员变量,但其他成员变量也会载入缓存造成浪费。当然,如果在迭代的时候能存取尽量多的成员变量,这个问题可能并不存在,但实际上是很困难的。

如果采用传统的OOP编程范式及实现方式,数据布局的问题几乎没有解决方案。所以在[1]里,作者提出,在某些情况下,应该放弃OOP方式,以数据的存取及布局为编程的考虑重中,称作面向数据编程(data-oriented programming, DOP)。

热点内容
服务器端的http地址 发布:2025-07-01 10:04:35 浏览:174
php好处 发布:2025-07-01 10:01:45 浏览:876
安卓车机什么屏幕好 发布:2025-07-01 09:46:15 浏览:546
编译原理re不能描述的串 发布:2025-07-01 09:34:24 浏览:75
本地电脑怎么用服务器ip 发布:2025-07-01 09:10:03 浏览:830
有趣的python代码 发布:2025-07-01 09:10:02 浏览:361
威龙奇兵ftp 发布:2025-07-01 09:07:38 浏览:694
linuxedit 发布:2025-07-01 09:03:36 浏览:424
跑分平台脚本 发布:2025-07-01 08:40:17 浏览:601
手机上的中文编程软件 发布:2025-07-01 08:39:13 浏览:822