struct A {
virtual ~A() { }
};
struct B { };
bool fn() {
A *volatile a = new A;
return dynamic_cast<B *>(a);
}
是的。dynamic_cast
没有超出其返回值的可观察行为。
编译器知道a
指向的静态类型。
因此,在as-if规则下,编译器可以在编译时自由地计算动态强制转换。
struct A { virtual ~A() {} };
struct B:A {};
bool foo() {
A* a = new A;
return dynamic_cast<B*>(a);
}
如果关闭了编译器优化(gcc-o0...),那么说'volatile'关键字没有区别是可以的吗? 我制作了一些示例“C”程序,并且仅当打开编译器优化时,才在生成的汇编代码中看到易失性和非易失性之间的区别,即((gcc-o1....)。
IE 可能会失败。 C11附件J.2内容如下
我在godbolt上编译这段代码。orgwith-O2和编译器不会使用一些memcpy对其进行优化,而是诚实地运行循环。 但是,如果我将“= src[i]”替换为“= 0”,他们会使用memset。但同样,当我用“ = 1”替换它时,它们会运行一个循环。当要设置的值不为零时,为什么它们会避免使用 memcpy 和 memset?我认为这是他们将执行的第一批优化之一。
请考虑以下简单代码: https://godbolt.org/z/i2kby7 您可以看到和都没有优化对的潜在调用。在我的理解中,这是正确的:抽象机器假设变量随时可能发生变化(例如,由于是硬件映射的),因此将初始化常数折叠为检查将是错误的。 > 这里讨论了消除对的读写操作:允许编译器优化本地volatile变量吗?(谢谢内森!)。我认为标准是非常清楚的,那些读写必须发生。但是这些讨论并不包括编译器
我有一个。为简单起见,假设 s 占据范围 -2^31 到 2^31-1。我想计算。我允许 是任何值 0 一种解决方案是计算< code>2*(x-1) 1。比我想要的多了一个减法,但是这个不应该溢出来。但是,编译器会将其优化为< code>2*x-1。这是源代码的问题吗?这是可执行文件的问题吗? 以下是 的弩线输出: 以下是 的闩线输出:
问题内容: 我正在为Pascal的子集编写编译器。编译器为一台组装好的机器生成机器指令。我想为此机器语言编写一个窥孔优化器,但是我无法替换一些更复杂的模式。 窥孔优化器规格 我研究了几种编写窥孔优化器的方法,并且选择了后端方法: 每当要生成机器指令时,编码器都会调用函数。 检查猫眼优化表: 如果当前指令与模式的尾部匹配: 检查先前发出的说明是否匹配 如果所有指令都与该模式匹配,则应用优化,修改代码