在 x86 32 位上的静态类实例中解决此问题
Addressing this in static classes instances on x86 32-bit
如果我定义类的静态实例,编译器(特别是 g++/clang)中是否有优化,以便在直接或间接访问数据成员时省略base
寄存器(对于this
调用)(我的意思是公式[base + index * scale + displacement]
),并且只对所有这些成员使用单个displacement
常量?所有成员函数都可以变为静态(在类的唯一实例的情况下,这是合理的)。
我无法检查这一点,因为编译器 godbolt.org 积极优化以下代码以xor eax, eax; ret
:
struct A
{
int i;
void f()
{
++i;
}
};
static A a;
int main(int argc, char * argv[])
{
a.i = argc;
}
简短的回答:也许吧。
长答案:现代编译器当然有能力优化获取this
指针,并且使用复杂的寻址模式绝对在我所知道的所有现代编译器(包括但不限于:gcc,clang和MS Visual C)的范围内。
特定编译器是否选择在特定构造上执行此操作取决于编译器对呈现给它的代码的"理解"程度。正如您刚刚经历的那样,编译器会删除您的所有代码,因为它实际上并没有"执行"任何操作。你只是在分配一个全局结构的成员,该成员永远不会再使用,所以编译器可以推理"好吧,你再也不会使用它了,所以我不会那样做"。删除static
,编译器可能不知道它没有在其他地方使用。或者打印a.i
的值,或者将其传递给无法内联的外部函数,等等。
在您的示例中,我真的只是希望编译器将argc
的值存储到a.i
的地址中,这可能可以通过两条指令来完成,argc
从堆栈移动到寄存器中,然后将该寄存器移动到为a.i
计算的内存中 - 根据编译器,这可能是一个常量地址。因此,在这种情况下不需要花哨的寻址模式。
相关文章:
- 从C++实例化QML
- 运行同一解决方案的另一个项目的项目
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- Project Euler问题4的错误解决方案
- Ardunio UNO解决了多个重叠的定时器循环
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在 x86 32 位上的静态类实例中解决此问题
- 单一实例对象的未解决外部符号链接错误
- 声明无法解决"实例化后的显式专用化"错误
- 创建'new'实例可以解决析构函数崩溃问题?
- 实例化函数的多个模板并在运行时选择的通用解决方案
- C++11 :从当前实例(此)进行unique_ptr的解决方法
- 由于抽象模板arg的实例化,Boost::lambda表达式编译失败.任何解释和/或解决方法
- C++对象实例化数组(我正在尝试找到编译时解决方案)