C ++

关于此主题的前几个问题:

这是我最近问的后续问题:clang:没有线外虚拟方法定义(纯粹的抽象C ++类),它被标记为这个问题的重复:clang的-Wweak-虚函数表? 我不认为这回答了我的问题,所以在这里我将重点放在让我感到困惑并且尚未得到解答的事情上。

我的场景:

我正在尝试使用Clang-3.5编译以下简单的C ++代码:

test.h:

class A
{
  public:
    A();
    virtual ~A() = 0;
};

test.cc

#include "test.h"

A::A() {;}
A::~A() {;}

我用来编译的命令(Linux,uname -r:3.16.0-4-amd64):

$clang-3.5 -Wweak-vtables -std=c++11 -c test.cc

我得到的错误是:

./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]

当A类不是纯粹的抽象时,上面的代码可以很好地构建。 下面的代码不会发出警告,唯一的变化是类A不再抽象:

test2.h:

class A
{
  public:
    A();
    virtual ~A();
};

test2.cc

#include "test2.h"

A::A() {;}
A::~A() {;}

我的问题

纯粹的抽象类有什么特别之处,以上代码在Clang中触发警告?


具有虚拟方法的类总是需要发出一个vtable。 编译器需要指示存储vtable的位置 - 通常位于实现其第一个函数的对象中。

纯粹的抽象类有什么特别之处? 由于它们没有方法,因此编译器必须在每个翻译单元中输出一个vtable,以便每个翻译单元可以引用纯粹的抽象基本类型。 这就是警告告诉你的。

例如,如果您想避免在非常低的内存环境下复制该内存,或者如果您查看对象并想知道为什么在该地点附近有多个vtable副本,您可能会关心它。

无论如何,您可以将多态指针指向A对象意味着编译器必须发出一些关于该类型的信息 - vtable。

如果您喜欢,您可以使用Clang的诊断编译指令禁用该块的警告:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wweak-vtables"
class A {
public:
    virtual void doSomething() = 0;
    virtual ~A() = 0;
};
#pragma clang diagnostic pop

这是你的困境:要么让课堂非纯粹抽象,要么关闭警告。 根据您的要求,您可能更喜欢一个或另一个,但与所有警告一​​样,您应该仔细考虑。

链接地址: http://www.djcxy.com/p/84015.html

上一篇: c++

下一篇: Where is firebase data center located ?