gpt4 book ai didi

c++ - 我的同事喜欢用memset初始化struct,我怎么劝他不要这样做?

转载 作者:搜寻专家 更新时间:2023-10-31 00:58:01 25 4
gpt4 key购买 nike

我的同事喜欢编写代码来使用 memset 初始化结构的字段,如下所示:

struct Fun {
int mem;
int cpu;
std::map<int, int> cpumap;
std::string str;

Fun() {
int size = (char*)&(this->cpumap) - (char*)this;
memset(this, 0, size);
}
};

他说这段代码是 100% 正确的,可以很好地完成工作。那么这是在 C++ 中初始化结构的典型方法吗?我的意思是这种代码的行为定义得很好?

最佳答案

memset , malloc , calloc等等是 C 做事的方式——它们不是 C++ 惯用的,只在 C++ 中真正受支持,因此您可以直接使用 C 代码。请注意,即使在 C 中,您也可以使用 struct someStruct = {0}零初始化结构的语法,因此使用 memset即使在 C 中也不需要 with structs。memset真正用于清零缓冲区,而不是对象。

至于他关于正确性的断言,我会说他实际上是错误的。

这是我的观察结果的 list :

  • 需要程序员手动把第一个和最后一个成员放在表达式中计算size (为什么不直接使用 sizeof 运算符?)。
    • 我注意到你给出的例子的意图并不明确:虽然它清除了三个标量成员,但它是否也意味着清除 memcpumap成员? (如果另一个程序员添加了这两个字段并忘记更新构造函数怎么办?)
  • 继承失败:this的值将指向最顶层父级的开始,而不是第一个非继承字段,因此除了盲目覆盖父级数据之外,如果父级构造函数具有相同的“初始化”逻辑,您将多次执行此操作。
  • size计算发生在运行时,而不是编译时,这会浪费 CPU 周期。
  • 他正在使用 int size而不是 size_t size所以它可能不适用于 sizeof(void*) != sizeof(int) 的系统(例如 x64、一些晦涩的 ISA、某些嵌入式架构等)
  • 他正在盲目转换到(char*)即使那可能不合适。同时 sizeof(char)保证是 1我不相信它可以保证 char*始终是 void* 的适当代理.
    • 此外,这是一个 C 风格的转换。在 C++ 中,转换运算符 static_cast , reinterpret_cast , 和 dynamic_cast总是优先于 (T)风格的 Actor 。
  • 它假设所有成员都存在于其声明顺序定义的范围内。您不能在 C++ 中做出此假设(参见此处:Do class/struct members always get created in memory in the order they were declared?),因为 1998 年和 2003 年的规范规定:

    The order of allocation of nonstatic data members separated by an access-specifier is unspecified

    所以在这种情况下,他的代码将取决于未定义的行为:

    struct Foo {
    private:
    int a;
    int b;
    public:
    int c;
    private:
    int d;
    }
    Foo::Foo() {
    int size = (char*)&this.d - (char*)&this.a;
    }
  • 危险的是,您不能假设归零成员是“有效的” - std::map 的实现和 std::string可能有不能为零的内部成员,通过盲目删除它们,您会将它们置于未知状态。这很危险。

要点是:不要这样做。

C++ 方法是使用初始化列表,它提供了很多编译时安全和保证,并且需要一个明确的初始值来保证类型安全。语法是:

struct Foo {
someType x;
int y;
foo bar;
};

Foo:Foo() :
x(0),
y(0),
bar(some_initial_bar_value) {
// any sequential init logic goes here
}

关于c++ - 我的同事喜欢用memset初始化struct,我怎么劝他不要这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36243747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com