为什么Microsoft code sample倾向使用ZeroMemory而不是{0}?
2009-02-20 09:14
363 查看
为什么Microsoft code sample倾向使用ZeroMemory而不是{0}?
这是最近看的一片短文的title,当时就很好奇。
经常查阅MSDN的程序员都会有这个印象,微软code sample中常见的是ZeroMemory,而不是语言提供的“{0}”清零功能(不过,我一直也没有问个why)。c++语法中声明对数组或纯结构(struct),可以使用例如SPerson sTest = {0}; 来将所有成员置0.
那篇文章的解释是,Microsoft使用ZeroMemory会更clear,因为“= {0}” 这样的语法有些生僻,不是所有人都可以一下子明白。
实际上,两者还是有一些区别。
其一,ZeroMemory会将结构所有字节置0,而={0}只会将成员置0,其中padding字节不变。
其二,但一个struct有构造函数或虚函数时,ZeroMemory可以,而={0}会编译不过。显然,后者起到了一些保护作用,因为对一个有虚函数的对象使用ZeroMemory时,会将其虚函数的指针置0,这是非常危险的,因为调用虚函数时,程序显然会crash。参看如下代码:
struct SPerson
{
//SPerson(){ }
char c;
float s;
};
class CTestVirtual
{
public:
CTestVirtual()
{
}
virtual int Draw()
{
return 10;
}
int a;
};
void Test()
{
char sztmp[20];
ZeroMemory(sztmp, sizeof(sztmp));
SPerson sTest = {0};
int i = sizeof(SPerson);
//CTestVirtual otv = {0}; //Compire error
CTestVirtual tv;
ZeroMemory(&tv, sizeof(tv));
tv.Draw(); //As it is an object, don't use the virtual function pointer, so don't crash.
CTestVirtual *pTv = &tv;
pTv->Draw(); //Crash!!!
}
因此,在windows平台下,对于数组或纯结构使用ZeroMemory是安全的,对于class,则使用构造函数,不要调用ZeroMemory。如果有跨平台要求,使用={0}则可以减少一些工作。
这是最近看的一片短文的title,当时就很好奇。
经常查阅MSDN的程序员都会有这个印象,微软code sample中常见的是ZeroMemory,而不是语言提供的“{0}”清零功能(不过,我一直也没有问个why)。c++语法中声明对数组或纯结构(struct),可以使用例如SPerson sTest = {0}; 来将所有成员置0.
那篇文章的解释是,Microsoft使用ZeroMemory会更clear,因为“= {0}” 这样的语法有些生僻,不是所有人都可以一下子明白。
实际上,两者还是有一些区别。
其一,ZeroMemory会将结构所有字节置0,而={0}只会将成员置0,其中padding字节不变。
其二,但一个struct有构造函数或虚函数时,ZeroMemory可以,而={0}会编译不过。显然,后者起到了一些保护作用,因为对一个有虚函数的对象使用ZeroMemory时,会将其虚函数的指针置0,这是非常危险的,因为调用虚函数时,程序显然会crash。参看如下代码:
struct SPerson
{
//SPerson(){ }
char c;
float s;
};
class CTestVirtual
{
public:
CTestVirtual()
{
}
virtual int Draw()
{
return 10;
}
int a;
};
void Test()
{
char sztmp[20];
ZeroMemory(sztmp, sizeof(sztmp));
SPerson sTest = {0};
int i = sizeof(SPerson);
//CTestVirtual otv = {0}; //Compire error
CTestVirtual tv;
ZeroMemory(&tv, sizeof(tv));
tv.Draw(); //As it is an object, don't use the virtual function pointer, so don't crash.
CTestVirtual *pTv = &tv;
pTv->Draw(); //Crash!!!
}
因此,在windows平台下,对于数组或纯结构使用ZeroMemory是安全的,对于class,则使用构造函数,不要调用ZeroMemory。如果有跨平台要求,使用={0}则可以减少一些工作。
相关文章推荐
- 为什么Microsoft code sample倾向使用ZeroMemory而不是{0}?
- 为什么要使用SLF4J而不是Log4J
- 为什么要使用SLF4J而不是Log4J
- IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题
- [Announcement] Free Code Sample Request Service from the Microsoft All-In-One Code Framework team
- 为什么你需要使用instancetype而不是id
- 为什么我们使用Nginx而不是Apache?
- 为什么要使用SLF4J而不是Log4J
- 为什么你应该使用OpenGL而不是DirectX?
- 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配
- JDBC为什么要使用PreparedStatement而不是Statement
- 为什么使用PreparedStatement而不是Statement
- 一篇博客:分类模型的 Loss 为什么使用 cross entropy 而不是 classification error 或 squared error
- 为什么使用对象指针而不是使用对象本身?
- JDBC为什么要使用PreparedStatement而不是Statement
- (2.1.22)JDBC为什么要使用PreparedStatement而不是Statement
- 我为什么使用Firefox浏览器而不是Chrome
- JDBC为什么要使用PreparedStatement而不是Statement
- 为什么要使用SLF4J而不是Log4J
- JDBC为什么要使用PreparedStatement而不是Statement?