C++ 消除未使用的虚拟函数

C++ 消除未使用的虚拟函数,c++,visual-c++,linker,C++,Visual C++,Linker,是否可以从下面的简单代码中让MS linker删除D::Unused函数 class B { virtual const char* Unused() = 0; }; class D : public B { const char* Unused() override; }; const char* D::Unused() { return "this string is unused"; } int main() { D* d = new D; delete d; r

是否可以从下面的简单代码中让MS linker删除
D::Unused
函数

class B {
  virtual const char* Unused() = 0;
};

class D : public B {
  const char* Unused() override;
};

const char* D::Unused() { return "this string is unused"; }

int main() {
  D* d = new D;
  delete d;
  return 0;
}

我试图用vs2017+
/OPT:REF/OPT:ICF/LTCG
实现这一点,但生成的二进制文件仍然包含
“此字符串未使用”
字符串的字节。

它可能无法删除此函数,因为
类D的虚拟表引用了此函数。类D的虚拟表由其构造函数和析构函数引用。

只是猜测,但将其标记为final
可能会奏效……我猜答案是否定的。。但是,如果类只在一个TU中使用,您也可以尝试将其移动到匿名名称空间中。这会让编译器知道不需要它。但我怀疑它不能移除它,因为它会破坏v的bincompat-table@JesperJuhl,只是试图使
D
D::Unused
-
成为final
,但没有成功。@Mgetz,不幸的是,在实际程序中,这个类是从其他单元使用的(但函数本身从未使用过)@xpp\u T然后你要么从v-table中删除该插槽(如果可以并且不会破坏bin compat),要么就被卡住了。我相信这是真正的原因。但是为什么链接器优化不可能注意到这个函数体在生成的可执行文件中是冗余的呢?我不是要求删除vtable条目,只是要求删除引用的函数体。@xpp\u T不符合要求。问题在于,除非编译器能够证明对象的生存期,否则它必须假设虚拟保证适用。