Those two constructs a very different in their meaning. The first one uses a memset function,
which is intended to set a buffer of memory to certain value. The second to initialize an object. Let me explain it with a bit of code:
Lets assume you have a structure that has members only of POD types
struct POD_OnlyStruct
{
int a;
char b;
};
POD_OnlyStruct t = {}; // OK
POD_OnlyStruct t;
memset(&t, 0, sizeof t); // OK as well
In this case writing a POD_OnlyStruct
t = {} or POD_OnlyStruct
t; memset(&t, 0, sizeof t)doesn't make much difference, as the only difference we have here is the alignment bytes being set to zero-value in case of memset used.
Since you don't have access to those bytes normally, there's no difference for you.
On the other hand, since you've tagged your question as C++, let's try another example, with membertypes different from POD:
struct TestStruct
{
int a;
std::string b;
};
TestStruct t = {}; // OK
{
TestStruct t1;
memset(&t1, 0, sizeof t1); // ruins member 'b' of our struct
} // Application crashes here
In this case using an expression like TestStruct
t = {} is good, and using a memset on
it will lead to crash. Here's what happens if you use memset -
an object of type TestStruct is
created, thus creating an object of type std::string,
since it's a member of our structure. Next, memset sets
the memory where the object b was
located to certain value, say zero. Now, once our TestStruct object goes out of scope, it is going to be destroyed and when the turn comes to it's member std::string
byou'll see a crash, as all of that object's internal structures were ruined by the memset.
So, the reality is, those things are very different, and although you sometimes need to memset a
whole structure to zeroes in certain cases, it's always important to make sure you understand what you're doing, and not make a mistake as in our second example.
My vote - use memset on
objects only if it is required, and use the default initialization x
= {} in all other cases.
In some compilers STRUCT
theStruct = {}; would translate to memset(
&theStruct, 0, sizeof( STRUCT ) ); in the executable. Some C functions are already linked in to do runtime setup so the compiler
have these library functions like memset/memcpy available to use.
本文探讨了C++中使用memset函数与默认初始化的区别。对于仅包含POD类型的结构体,两者差异不大;但对于包含复杂类型成员(如std::string)的结构体,使用memset可能导致程序崩溃。
2万+

被折叠的 条评论
为什么被折叠?



