Возврат пары элементов из функции - PullRequest
4 голосов
/ 21 октября 2010

Я знаю все обычные способы сделать это, и мне нужна статья, которую я прочитал давным-давно, в которой показано, как написать несколько сумасшедших вспомогательных функций, используя встроенную сборку и __naked функции для возврата пары элементов. .

Я пытался бесконечно гуглить, но безрезультатно, я надеюсь, что кто-то еще знает статью, о которой я говорю, и имеет ссылку на нее.

Ответы [ 2 ]

11 голосов
/ 21 октября 2010

Сборка не требуется

struct PairOfItems {int item1;double item2;};
struct PairOfItems crazyhelperfunction(void){
    struct PairOfItems x = {42, -0.42};
    return x;
}

Я не знаю о статье.

0 голосов
/ 21 октября 2010

__naked, о котором я знаю, это

#define __naked __attribute__((naked))

. Это задокументированный атрибут GCC здесь .

. Он поддерживается не для всех целей.,Выполнение поиска по коду Google приведет к его некоторому использованию.

Причины того, что это делается в виде макроса, заключаются в том, что его можно определить как пустое для целей, которые не 'или если заголовки используются с другим компилятором.

Я помню (я думаю), что видел некоторые примеры этого для функций деления и модуляции (divmod) для заголовков avr_gcc.Это вернуло структуру, в которой были оба возвращаемых значения, но все это хранилось в регистрах, а не в стеке.

Я не знаю, было ли __naked как-то связано со способностью возвращать обачасти результата (которые были в структуре) в регистрах (а не в стеке), но это позволяло встроенной функции полностью состоять из вызова одной вспомогательной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...