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

Coo*_*kyt 6 c++ memory

我有一个C++类,它有一个私有的未使用的char[]严格来添加填充到类,以防止在共享数组中使用该类时的错误共享.我的问题是双重的:

  1. 在某些情况下,编译器是否可以优化此数据成员?

  2. private field * not used当我编译时,如何使警告静音-Wall?优选地,没有明确地使警告静音,因为我仍然希望在其他地方捕获该问题的实例.

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

padding.cc

#include <iostream>

class A {
 public:
  int a_ {0};

 private:
  char padding_[64];
};

int main() {
  std::cout << sizeof(A) << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

汇编

$ 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
Run Code Online (Sandbox Code Playgroud)

Rob*_*rto 3

我不知道编译器优化,但您可以通过两种方式消除警告:或者使用编译指示:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-private-field"
class A{
//...
};
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)

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

class A{
friend void i_do_not_exist();
//... 
};
Run Code Online (Sandbox Code Playgroud)

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

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

class A {
 private:
  void ignore_padding__() { padding_[0] = 0; }
  //... 
};
Run Code Online (Sandbox Code Playgroud)