Chinaunix首页 | 论坛 | 博客
  • 博客访问: 367651
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:29:57

这是最近看的一片短文的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}则可以减少一些工作。

posted on 2005-06-29 21:23 Michael 阅读(4681)   

 re: 为什么Microsoft code sample倾向使用ZeroMemory而不是{0}? 2005-06-29 22:02

在C++风格下,还是给予一个恰当的缺省构造函数为妙。

 memset(this,0,sizeof(*this))也很不错,用memset而不是ZeroMemory 2005-06-30 09:10

rt

 re: Diviner 2005-06-30 09:32

memset有个潜在的危险。
它的后两个参数类型相同,但是含义大相径庭,如果不慎写反了就麻烦了。
这是一本linux/unix书上说的:P

 给七猫兄 2005-06-30 09:45

#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))

#define ZeroMemory RtlZeroMemory

还有,Michael论述了,会清零虚函数表指针。

 有虚函数当然不行了...,像一些value object还是可以用用 的。 2005-06-30 15:26

memset有个潜在的危险。
它的后两个参数类型相同,但是含义大相径庭,如果不慎写反了就麻烦了。
这是一本linux/unix书上说的:P

//==========
这是那个UNIX网络编程书上说的,作者搞错过的。

 re: Diviner 2005-06-30 16:31

好记性啊,偶就看过
《UNIX网络编程》

《LINUX网络编程》
都没记住是哪本说的:P

 re: 为什么Microsoft code sample倾向使用ZeroMemory而不是{0}? 2005-06-30 23:46

memset有个潜在的危险。
它的后两个参数类型相同,但是含义大相径庭,如果不慎写反了就麻烦了。
这是一本linux/unix书上说的:P

//==========
这是那个UNIX网络编程书上说的,作者搞错过的。

------------------------------
这是W.Richard Stevens说的。不过他最早说是在《UNIX环境高级编程》上说得,《UNIX网络编程》是他写的第三部巨著。:p


--------------------next---------------------

阅读(336) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~