编译器警告混合数组和多态

神奇的狐狸先生

在“更有效的C ++”中,提出了一个有趣的观点,即混合数组和多态是一个坏主意。例如:

class Base {
    public:
    Base(int y) : a(y) {}
    int a;
};

class D : public Base {
    public:
    D(int w, int y) : Base(y), c(w) {}
    int c;
};

std::ostream& operator<<(std::ostream& os, const Base &obj )
{
    os << obj.a << std::endl;
    return os;
}

// This function will work perfectly well if i pass in a `Base` array, 
// but if i pass in `D` array we are going to run into some problems. 
// Namely that `arr[i+1] = &arr[i] + sizeof(Base)` will not progress 
// the array correctly for a `D` array.
void printArray(const Base arr[]) {
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i];
    }
}

int main() {
   D arr[5] = { D(0, 10), D(1, 11), D(2, 12), D(3, 13), D(4, 14)};
   printArray(arr); // This compiles without complaint! I understand that the
                    // conversion is legal, but it seems like a warning
                    // about this would be a good idea. 
}

注意:我知道这是不好的设计,但这只是为了说明一点。

这里的问题是,当按照我上面的方式混合使用这两种方法时,当我们遍历数组进行打印时,我们将不会以正确的数量来处理数组的元素(即,我们移动sizeof(Base)而不是sizeof(D))。结果为输出:

10
0
11
1
12

[现场示例]

(我猜想这样打电话operator<<可能是UB)。

使用进行编译时,g++ -std=c++1y -Wall -Weffc++ -pedantic main.cpp我不会收到任何警告或错误。

  1. 在这种情况下,是否有我可以启用的指示警告的编译器标志?
  2. 如果没有,为什么不呢?
一些程序员哥们

编译器可以进行很多静态分析,并且可以知道arr函数中的指针用作具有意外结果的数组。

但是,这样做的速度很慢,并且会占用大量(更多)内存,并且程序员通常不耐烦,并且希望使用尽可能少的其他资源来尽可能快地完成其编译。因此,大多数编译器只进行相对快速简便的静态分析,而将艰苦的工作留给了专用的静态分析器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

operator []编译器错误和警告

来自分类Dev

Java中的混合类型和混合数组类型array Object []无法编译

来自分类Dev

编译器警告枚举

来自分类Dev

Dagger编译器警告

来自分类Dev

声明的参数限制和编译器警告

来自分类Dev

编译器和编译器

来自分类Dev

Swift编译器为什么无法找出混合类型数组中元素的类型?

来自分类Dev

IntelliJ编译器警告传播可变数组的空数组

来自分类Dev

混合数组排序

来自分类Dev

关闭资产目录编译器警告

来自分类Dev

资产目录编译器无故警告

来自分类Dev

禁止Swift编译器警告

来自分类Dev

Mailgun / AFNetworking的编译器警告

来自分类Dev

CLion:启用编译器错误/警告

来自分类Dev

printf如何发出编译器警告?

来自分类Dev

如何抑制编译器警告?

来自分类Dev

多次退出导致编译器警告

来自分类Dev

gcc编译器警告标志丢失

来自分类Dev

如果缺少const char *数组初始化逗号,则生成编译器警告

来自分类Dev

闭包编译器警告-HTMLCanvasElement和元素类型不匹配

来自分类Dev

所有Visual Studio编译器错误和警告的列表及其编号

来自分类Dev

注册解析通知iOS7和iOS8,编译器警告

来自分类Dev

如何解决编译器警告C6386和C6385?

来自分类Dev

由于编译器错误和警告,我无法运行JFrame

来自分类Dev

闭包编译器警告-HTMLCanvasElement和元素类型不匹配

来自分类Dev

Java编译器警告会影响编译时间吗?

来自分类Dev

Java编译器警告会影响编译时间吗?

来自分类Dev

Kotlin编译器混合了化类型参数

来自分类Dev

编译器中的数组分配