在我的C ++代码中,我必须处理用C语言编写的接口以及CUDA内核。我在Stackoverflow上发布了一些关于如何在C ++中执行此操作的问题。我得到了很多答案:"不要这样做。在C ++中有更好的解决方案,看看这个或那个。"另一方面,我认为由于与C接口或CUDA的交互,我真的已经以这种方式做到了。
长话短说:我越来越意识到,在以优秀的C ++理念设计代码时,C接口和低级别的东西会导致困难。
我现在想要什么?我正在寻找一些像#34; Effective C ++"但特别是那些必须处理低级别方面的人。
答案 0 :(得分:0)
您希望在架构师和设计代码时牢记一些概念:
通用架构是使用金字塔布局进行抽象。最底层知道硬件的细节。向上的每一层都是从硬件到应用程序的抽象。
这里的想法是,与单个硬件项相关的每件事都应该在其封装中。除了放置在不同地址之外,共享相同功能的公共设备应该从单个接口继承。
例如,给定地址为0x1000,0x2000和0x3000的3个USB端口,都具有相同的方式。唯一的区别是它们的硬件寄存器位于不同的地址。因此,应该有一个USB_Interface_Base_Class,以及3个实例或3个子类。
USB类应该只暴露基本功能。类的用户不关心硬件寄存器,只关心执行I / O.因此,细节对班级的外部用户是隐藏的。
在研发期间,硬件不稳定且可能发生变化。它也可能在生产过程中发生变化目标是减少变化的传播。例如,如果USB接口更改为无线,则硬件访问层应更改,但更改不应传播到应用程序中。需要更改的模块越少越好。
远离硬件的每一层应该处于比前一个较低层更高的抽象层。
例如,最高抽象执行:`cout<< “你好\ N” 的; 下一层可以缓冲数据并调用“驱动程序” 司机说它想与字符输出设备通话。默认字符设备连接到USB USB驱动程序与硬件接口通信以设置寄存器并传输数据。
在最高级别,用户希望将文本输出到默认输出端口,这是抽象。下面的图层填写详细信息以完成工作。
两个或模块之间的依赖关系是耦合。从紧到松都有一定程度的耦合。当对一个模块的内部更改需要更改为另一个模块时,认为两个模块紧密耦合。当对一个模块的内部更改不影响另一个模块时,两个模块松散耦合。
松耦合的目标是帮助减少整个系统的变化传播。如果一个模块访问另一个模块的数据成员并且数据成员发生更改,则调用模块需要更改。如果调用模块使用接口,则提供者可以更改其数据成员而不会对调用模块产生任何影响。变化的传播已经停止。
访问硬件比编码更多。应首先考虑封装,变换传播,抽象和耦合的原则。访问硬件的代码应遵循原则。一个好的过程是在编码之前设计和设计原则。