我听到有人说c++程序员应该避免使用memset,
class ArrInit {
//! int a[1024] = { 0 };
int a[1024];
public:
ArrInit() { memset(a, 0, 1024 * sizeof(int)); }
};考虑到上面的代码,如果你不使用memset,你怎么能让a1..1024填充0呢? C++中的memset有什么问题呢?
谢谢。
发布于 2009-12-30 02:02:15
问题不是在内置类型上使用memset(),而是在class (也称为非POD)类型上使用它们。这样做几乎总是做错误的事情,并且经常做致命的事情-例如,它可能会践踏虚拟函数表指针。
发布于 2009-12-30 02:14:57
在C++中,std::fill或std::fill_n可能是更好的选择,因为它是通用的,因此可以操作对象和PODs。但是,memset操作的是原始的字节序列,因此永远不应该用来初始化非PODs。无论如何,如果类型是POD,std::fill的优化实现可以在内部使用专门化来调用memset。
发布于 2009-12-30 01:55:02
零初始化应该如下所示:
class ArrInit {
int a[1024];
public:
ArrInit(): a() { }
};至于使用memset,有几种方法可以使使用更加健壮(与所有此类函数一样):避免对数组的大小和类型进行硬编码:
memset(a, 0, sizeof(a));对于额外的编译时检查,还可以确保a确实是一个数组(因此sizeof(a)是有意义的):
template <class T, size_t N>
size_t array_bytes(const T (&)[N]) //accepts only real arrays
{
return sizeof(T) * N;
}
ArrInit() { memset(a, 0, array_bytes(a)); }但是对于非字符类型,我想您用它来填充的唯一值是0,并且零初始化应该已经以某种方式可用。
https://stackoverflow.com/questions/1975916
复制相似问题