Я знаю, что порядок оценки параметров функции неопределенные в 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 ++ я должен попытаться сделать код выше, чтобы сначала оценить?
Так что толкнул стека до б.
Спасибо
Порядок оценки параметров существенно зависит от соглашения о вызовах, используемого для вызова данной функции — если параметры помещаются в стек RTL, обычно удобнее сначала разработать самые правые параметры.
В соответствии с этот таблица, на x86 единственное соглашение о вызовах, доступное на IA32 с порядком параметров LTR в стеке, является fastcall
на Borland, тем не менее, первые три целочисленных параметра / указателя передаются в регистрах. Таким образом, вы должны написать функцию, которая принимает более трех целых чисел, пометьте ее как fastcall
и скомпилируйте его с помощью компилятора Borland; в таком случае наверное другие параметры, кроме первых трех, должны оцениваться в порядке LTR.
Переходя на другие платформы, вы, вероятно, найдете другие соглашения о вызовах с передачей параметров LTR (и, возможно, с оценкой параметров LTR).
Обратите внимание, что порядок передачи параметров <=> порядок оценки параметров логически связан, но если по какой-то причине компилятор обнаружит, что лучше оценить один параметр, прежде чем другие, в стандарте нет ничего, что мешало бы ему это сделать.
Других решений пока нет …