【发布时间】:2014-03-23 19:16:10
【问题描述】:
刚刚启动了一个 Visual Studio 项目来查看程序集以取消引用指针。我有这个 C++:
int main(){
std::vector<int>* x = new std::vector<int>();
x->resize(10);
return 1;
}
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)
我对上述问题有几个问题:
-
dword ptr[x]究竟是什么意思?指向x的指针地址? - 为什么上面的值被复制到
ecx?我知道这是因为正在调用resize()的函数,但为什么要特别注册 ecx 呢? - 是取消引用
mov dword ptr [x],ecx部件的唯一装配线吗?
我正在尝试了解取消引用指针的成本。
【问题讨论】:
-
当前 CPU 交错(部分)执行指令,确切的交错取决于周围的指令。取消引用的确切存储位置也会影响指令。因此,“取消引用的成本”作为价值意义不大。此外,在当前的 CPU 中,访问 RAM 的成本与数百条指令相同。不要担心这样的时间安排,除非测量表明这是你的瓶颈。