[英]Consistently defining C++ class members as unique pointers;
在C ++中,常见的情况是:
C类头
//== C.h ==//
#pragma once
#include "B.h"
class C
{
B b;
};
B类头
//== B.h ==//
#pragma once
#include "A.h"
class B
{
A a;
};
A类头
//== A.h ==//
#pragma once
class A
{
};
因为Ch
包括Bh
, Bh
包括Ah
; Ch
最后知道了有关Ah
实现细节。 在这种情况下,标头仅包含三层,但是在大型项目中,如果包含一个标头,很快就会导致包含数百个其他标头。 也导致较长的编译时间。
在C ++ 11中,我可以将标头声明如下:
C类标题:
//== C.h ==//
#pragma once
#include <memory>
// proto
class B;
class C
{
std::unique_ptr<B> b;
};
B类头
//== B.h ==//
#pragma once
#include <memory>
// proto
class A;
class B
{
std::unique_ptr<A> a;
};
A类头
//== A.h ==//
#pragma once
class A
{
};
用智能指针替换所有成员(类,结构)时,我可以包含Ch
而不必知道类B的实现。每个cpp文件现在只需要了解其成员,而不必了解其成员的内存布局。
我的问题是:
如果直接类型的直接数据成员的类型支持复制,则默认情况下支持复制。 而且效率最高。 如果有人觉得为了缩短构建时间而进行交易是值得的,那么为什么要使用C ++,为什么不(然后)只使用一种最大限度地利用这种权衡的语言,例如Java或C#呢。
换句话说,这似乎不是一个好主意。
为了在仍使用C ++的同时缩短构建时间,请考虑使用更快的计算机或构建服务器暂存区。
用指针替换所有成员不是一个好主意,因为这会增加额外的解引用层。 直接成员实际上是在包含对象内分配的,因此访问它只需要相对于包含对象的位置有一个固定的偏移量。
如果将所有内容都隐藏在指针后面,则需要访问该指针成员,然后取消对该指针的引用以访问数据(该数据将位于内存中的其他位置)。 从单个角度看,这是微不足道的开销,但是如果将原理扩展到整个程序中,这很快就会加起来。
要记住的另一个问题是可维护性。 如果通过指针存储所有内容,则需要手动进行适当的构造和复制。 这可能会导致大型项目出现各种问题,因为这增加了程序员出错的可能性。 相比之下,如果您使用直接成员,则编译器会自动执行很多操作。
值得一提的替代方法是PIMPL设计模式(私有实现或实现的指针)。 从本质上讲,这是一种将类的私有详细信息隐藏在其源文件中的方法,目的是减少头文件的依赖性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.