Какой компилятор первым оценивает самый левый параметр

Я знаю, что порядок оценки параметров функции неопределенные в C ++, см. ниже,

// Простой очевидный.

callFunc(getA(),getB());

Может быть эквивалент к этому:

int a = getA();
int b = getB();
callFunc(a,b);
Or this:

int b = getB();
int a = getA();
callFunc(a,b);

Это идеально хорошо & Я думаю, что большинство людей знают это.

Но я попробовал VC10, gcc 4.72, и все они сначала вычисляют b (справа налево), что означает, что b сначала помещают в кадр стека, а затем a.

Мне просто интересно, какой компилятор C ++ я должен попытаться сделать код выше, чтобы сначала оценить?
Так что толкнул стека до б.

Спасибо

2

Решение

Порядок оценки параметров существенно зависит от соглашения о вызовах, используемого для вызова данной функции — если параметры помещаются в стек RTL, обычно удобнее сначала разработать самые правые параметры.

В соответствии с этот таблица, на x86 единственное соглашение о вызовах, доступное на IA32 с порядком параметров LTR в стеке, является fastcall на Borland, тем не менее, первые три целочисленных параметра / указателя передаются в регистрах. Таким образом, вы должны написать функцию, которая принимает более трех целых чисел, пометьте ее как fastcall и скомпилируйте его с помощью компилятора Borland; в таком случае наверное другие параметры, кроме первых трех, должны оцениваться в порядке LTR.

Переходя на другие платформы, вы, вероятно, найдете другие соглашения о вызовах с передачей параметров LTR (и, возможно, с оценкой параметров LTR).

Обратите внимание, что порядок передачи параметров <=> порядок оценки параметров логически связан, но если по какой-то причине компилятор обнаружит, что лучше оценить один параметр, прежде чем другие, в стандарте нет ничего, что мешало бы ему это сделать.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]