Цзин Цзэн прав. Я хотел бы добавить свои замечания здесь. Когда вызывается функция, аргументы помещаются в стек справа налево. Например, допустим, у вас есть эта произвольная функция.
int add(int a, int b) {
int c;
c = a + b;
return c;
}
Вот кадр стека для функции:
------
b
------
a
------
ret
------
c
------
Эта диаграмма выше является рамкой стека для этой функции! Как вы можете видеть, сначала b помещается в стек, затем a помещается в стек. После этого адрес возврата функции помещается в стек. Адрес возврата функции содержит местоположение в main (), откуда функция была первоначально вызвана, и после выполнения функции выполнение программы переходит к адресу возврата этой функции. Затем любые локальные переменные, такие как c, помещаются в стек.
Теперь главное, чтобы аргументы помещались в стек справа налево. В основном, любые заданные по умолчанию параметры являются литеральными значениями, которые хранятся в разделе кода исполняемого файла. Когда выполнение программы встречает параметр по умолчанию без соответствующего аргумента, оно помещает это литеральное значение в вершину стека. Затем он смотрит на a и помещает значение аргумента в верхнюю часть стека. Указатель стека всегда указывает на вершину стека, вашей последней помещенной переменной. Поэтому любые литеральные значения, которые вы помещаете в стек в качестве параметров по умолчанию, находятся «позади» указателя стека.
Вероятно, более эффективным для компилятора было сначала быстро помещать произвольные литеральные значения по умолчанию в стек сначала, поскольку они не хранятся в ячейке памяти, и быстро собирать стек. Подумайте, что было бы, если бы переменные сначала были помещены в стек, а затем литералы. Доступ к области памяти для CPU занимает относительно много времени по сравнению с извлечением литерального значения из схемы или регистра CPU. Поскольку для вставки переменных в стек требуется больше времени, чем для литералов, литералам придется ждать, тогда и обратному адресу придется ждать, и локальным переменным также придется ждать. Вероятно, это не очень важно для эффективности, но это всего лишь моя теория, почему аргументы по умолчанию всегда находятся в самых правых позициях заголовка функции в C ++. Это означает, что компилятор был спроектирован как таковой.