gpt4 book ai didi

c++ - 可以在 C++ 中优化掉未使用的数据成员吗

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:50 25 4
gpt4 key购买 nike

我有一个 C++ 类,它有一个私有(private)未使用的 char[] 严格地向类添加填充,以防止在共享数组中使用该类时出现错误共享。我的问题有两个:

  1. 这个数据成员在某些情况下可以被编译器优化掉吗?

  2. 当我使用 -Wall 编译时,如何消除 private field * not used 警告?最好不要明确地消除警告,因为我仍然想在其他地方捕获此问题的实例。

我写了一个小测试来检查我的编译器,似乎该成员没有被删除,但我想知道标准是否允许这种优化。

填充.cc

#include <iostream>

class A {
public:
int a_ {0};

private:
char padding_[64];
};

int main() {
std::cout << sizeof(A) << std::endl;
return 0;
}

编译

$ clang++ --version
clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix

$ clang++ -std=c++11 -O3 -Wall padding.cc
padding.cc:8:8: warning: private field 'padding_' is not used [-Wunused-private-field]
char padding_[64];
^
1 warning generated.

$ ./a.out
68

最佳答案

我不知道编译器优化,但您可以通过两种方式消除警告:要么使用 pragmas:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-private-field"
class A{
//...
};
#pragma clang diagnostic pop

或者,这可能更适合你,在你的类中包含一个假 friend 函数:

class A{
friend void i_do_not_exist();
//...
};

这样,编译器就不知道该字段是否被使用了。因此,它不会提示,也绝对不会扔掉任何东西。如果在任何地方定义了 i_do_not_exist() 函数,这可能会导致安全问题,因为该函数可以直接访问类的私有(private)成员。

第三种解决方案是定义一个访问 padding_ 成员的虚拟函数:

class A {
private:
void ignore_padding__() { padding_[0] = 0; }
//...
};

关于c++ - 可以在 C++ 中优化掉未使用的数据成员吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23176564/

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