最近我的一位朋友问我如何在C++中阻止类继承.他希望编译失败.
我在考虑它并找到了3个答案.不确定哪个是最好的.
1)私人建设者
class CBase
{
public:
static CBase* CreateInstance()
{
CBase* b1 = new CBase();
return b1;
}
private:
CBase() { }
CBase(CBase3) { }
CBase& operator=(CBase&) { }
};
Run Code Online (Sandbox Code Playgroud)
2)使用CSealed基类,私有ctor和虚拟继承
class CSealed
{
private:
CSealed() {
}
friend class CBase;
};
class CBase : virtual CSealed
{
public:
CBase() {
}
};
Run Code Online (Sandbox Code Playgroud)
3)使用CSealed基类,受保护的ctor和虚拟继承
class CSealed
{
protected:
CSealed() {
}
};
class CBase : virtual CSealed
{
public:
CBase() {
}
};
Run Code Online (Sandbox Code Playgroud)
以上所有方法都确保不能继承CBase类.我的问题是:
1)哪种方法最好?还有其他方法吗?
2)除非CSealed类是虚拟继承的,否则方法2和3将不起作用.这是为什么 ?它与vdisp ptr有什么关系吗?
PS: …
我一直在努力寻找编写文件复制例程的最快方法,将大文件复制到RAID 5硬件上.
平均文件大小约为2 GB.
有2个窗口框(都运行win2k3).第一个框是源,大文件位于何处.第二个盒子有一个RAID 5存储.
http://blogs.technet.com/askperf/archive/2007/05/08/slow-large-file-copy-issues.aspx
以上链接清楚地解释了为什么Windows复制,robocopy和其他常见的复制实用程序在写入性能方面受到影响.因此,我编写了一个C/C++程序,它使用带有NO_BUFFERING&WRITE_THROUGHflags的CreateFile,ReadFile和WriteFile API .该程序模拟ESEUTIL.exe,从某种意义上说,它使用2个线程,一个用于读取,一个用于写入.读取器线程从源读取256 KB并填充缓冲区.一旦填充了16个这样的256 KB块,写入器线程就会将缓冲区中的内容写入目标文件.如您所见,编写器线程在一次写入中写入8MB的数据.该程序分配32个这样的8MB块...因此,写入和读取可以并行发生.可以在上面的链接中找到ESEUtil.exe的详细信息.注意:我在使用时负责数据对齐问题NO_BUFFERING.
我使用像ATTO这样的台式标记实用程序,发现我们的RAID 5硬件在写入8MB数据块时的写入速度为每秒44MB.每分钟大约2.57 GB.
但我的程序每分钟只能达到1.4 GB.
任何人都可以帮我确定问题是什么?是否有更快的API的其他说CreateFile,ReadFile,WriteFile可用?