C++指针访问类似于程序集

C++ Pointer access similar to assembly

本文关键字:程序集 类似于 访问 指针 C++      更新时间:2023-10-16

有时我在C++中看到不同的数组访问样式,并认为这可能与程序集寻址模式有关:

C++:

int * aa=new int[2];
0[aa]=15; //a little different than aa[0]
1[aa]=15;
aa[0]=15;
aa[1]=15;
printf("%d %d n",aa[0],aa[1]);

装配:

__asm
{
    mov aa[0],ebx
    mov aa[1],eax
    mov 0[aa],ebx
    mov 1[aa],eax
}

这个C++数组访问表示法是标准的吗?如果是,它是从程序集寻址模式派生的吗

当我尝试[aa]1=5;时,编译器会给出

  • "未找到aa属性"
  • "在'constant'之前缺少';'"
  • "左操作数必须是l-value"。

    //当我尝试指针算术时,

    *(aa+1)=0//无错误

    *(aa+0)=0//没有错误:)

对于运算符[]重载,此规则相同吗

MSVC++2010

谢谢。

这是C和C++的一个众所周知的怪癖,他们并不关心表达式的哪一半放在方括号[]中。它们的评估结果都是相同的等价表达式:

*(0+aa)=15;

表达式a[b]本质上被转换为*(a+b)。这就是为什么这种"风格"的11[arr]是可能的。

[aa]11失败的原因纯粹是句法上的。

这种C++数组访问表示法是标准的吗?

是的。只要一个操作数是指针,另一个是算术,a[b]就等价于*(a+b),所以指针或索引是否进入[]内部都无关紧要。

如果是,它是从程序集寻址模式派生的吗?

几乎可以肯定不是。语法直接来自C,它最初是为PDP系列计算机开发的,其中的汇编寻址模式是1(aa)

当我尝试[aa]1=5时,编译器会给出(错误)

这是因为下标表达式的语法被指定为postfix-expression [ expression ],所以[]中的操作数必须在另一个之后。

这个规则对于运算符[]重载是否相同?

没有。如果运算符已过载,则a[b]等效于a.operator[](b),而不是b.operator[](a)