在我的C++代码中,我必须处理用C以及CUDA内核编写的接口(interface)。我在这里在Stackoverflow上发布了一些问题,如何在C++中做到这一点。我得到了很多答案,例如:“不要那样做。在C++中有更好的解决方案,请看一看。另一方面,我认为由于与C接口(interface)或CUDA的交互,我确实必须这样做。
长话短说:我越来越意识到,以良好的C++原理设计代码时,C接口(interface)和低级内容会带来困难。
我现在想要什么?我正在寻找诸如“有效C++”之类的文献,但这些文献专门针对那些必须处理低级方面的人员。
最佳答案
在设计和设计代码时,您需要牢记一些概念:
常见的体系结构是使用金字塔布局进行抽象。最底层知道硬件的细节。向上的每一层都是从硬件到应用程序的抽象。
封装和数据隐藏
这里的想法是,与单个硬件项目有关的所有事物都应该在其封装中。共享相同功能的通用设备(除了它们位于不同的地址之外)应从单个接口(interface)继承。
例如,给定地址为0x1000、0x2000和0x3000的3个USB端口,它们的方式相同。唯一的区别是它们的硬件寄存器位于不同的地址。因此,应该有一个USB_Interface_Base_Class,以及3个实例或3个子类。
USB类仅应公开基本功能。类的用户不关心硬件寄存器,仅关心执行I / O。因此,这些细节对于该类的外部用户是隐藏的。
传播变化
在研究和开发过程中,硬件易变并且会更改。在生产过程中也可能会发生变化。目的是减少变化的传播。例如,如果USB接口(interface)更改为Wireless,则硬件访问层应更改,但更改不应深入到应用程序中。需要更改的模块越少越好。
细节和抽象
远离硬件的每一层都应比先前的较低层具有更高的抽象级别。
例如,最高的抽象执行:`cout <下一层可以缓冲数据并调用“驱动程序”。
驾驶员说想与角色输出设备对话。默认字符设备已连接到USB。
USB驱动程序与硬件接口(interface)进行对话以设置寄存器并传输数据。
在最高级别上,用户希望将文本输出到默认的输出端口,即抽象端口。下面的层填充细节以完成工作。
耦合/依赖
两个或模块之间的依赖关系是耦合的。从紧密到松散都有一定程度的耦合。当内部更改为一个模块需要更改为另一个模块时,两个模块被认为是紧密耦合的。当一个模块的内部更改不影响另一个模块时,两个模块将松散耦合。
松散耦合的目的是帮助减少更改在整个系统中的传播。如果一个模块访问另一个模块的数据成员,并且数据成员发生更改,则调用模块需要更改。如果调用模块使用接口(interface),则提供程序可以更改其数据成员,而不会影响调用模块。变化的传播已经停止。
概要
除了编码之外,访问硬件还有更多。首先应考虑封装,更改传播,抽象和耦合的原理。访问硬件的代码应遵循以下原则。一个好的过程是在编码之前,在设计和设计时要牢记原则。
关于c++ - 与低级接口(interface)交互时如何编写良好的C++?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26997589/