use*_*112 3 c++ x86 assembly pointers
刚刚启动了一个Visual Studio项目,以查看该程序集以取消对指针的引用。我有这个C ++:
int main(){
std::vector<int>* x = new std::vector<int>();
x->resize(10);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
asm(用于取消引用):
mov dword ptr [x],ecx
x->resize(10);
push 0Ah
mov ecx,dword ptr [x]
call std::vector<int,std::allocator<int> >::resize (0BC124Eh)
Run Code Online (Sandbox Code Playgroud)
关于上述问题,我有几个问题:
dword ptr[x]实际上是什么意思?指向x的指针地址?ecx?我知道这是因为要进行函数调用resize(),但是为什么要特别注册ecx?mov dword ptr [x],ecx零件的唯一装配线吗?我试图了解被取消引用的指针的成本。
mov ecx, dword ptr [x]表示:将双字(32位)从存储位置x移至ecx寄存器。它只是汇编语言的语法功能,用于表示存在内存访问,并且其大小为32位。
在考虑指针时,有助于牢记有关基础架构的几点:
因此,当您实际上在C ++中声明一个指向对象的指针时,在大多数情况下它不会影响生成的代码。例如,以下两段代码在进行优化编译时将产生相同的汇编代码:
Obj a;
a.function();
Obj a;
Obj *b = &a;
b->function();
Run Code Online (Sandbox Code Playgroud)
与您的代码的唯一区别是您在堆上分配了内存(通过new)。那是一个额外的函数调用,它还意味着您必须delete在最后多加注意(您的演示代码会错过!)。除此之外,优化的编译器还将为的所有实际用法生成性能相同的代码x。我猜您的代码是在没有优化的情况下编译的,因为否则内存访问将被完全优化掉。
在一种情况下,指向对象的单个指针是一种特殊情况:内存中的所有对象都必须通过指针访问,即使它们未在C ++中显式显示。因此,一旦启用优化,单指针情况将与无指针情况相同。
一言以蔽之,指针链变得更慢,需要多次内存访问。这通常发生在链接结构上:
struct C { int value; };
struct B { C* c; };
struct A { B* b; };
A a = initialize_A();
a->b->c->value = 7;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,需要取消引用几个指针才能访问final value。
向量的地址将被复制到ecx寄存器,因为this在Microsoft fastcall约定中,指针位于此处。