Я знаю, что этому больше недели, но все равно:
Во-первых, я не знаю, сработает ли это, но не могли бы вы просто написать макрос, похожий на вызов функции, который расширится до инструкции встроенного перехода, в буфер в соответствующей структуре? Это было бы похоже на переход к данным в структуре, без вызова / настройки вызова функции, но в коде это выглядело бы как вызов функции - но не было бы снижения производительности, потому что оно было бы обработано препроцессор во время компиляции.
Но этот тип поведения программы не подходит для C. Как указывалось в других ответах, код, содержащийся в вашем буфере, будет строго ограничен (нет доступа к внешним / статическим переменным, нет вызовов внешних функций и т. Д.), Он легко сломается (в случае защиты от выполнения на страницах памяти) не может вернуться из-за отсутствия настройки регистра ссылок и т. д.) и может быть действительно непереносимым (кроме того, это, вероятно, будет ад для читаемости - никто не сможет понять, что вы пытаясь обойтись без большого количества ударов головой о стол).
Не говоря уже о том, что использование буфера для хранения исполняемых данных аналогично указателю на функцию (поскольку буфер в любом случае является просто указателем на данные).
При этом, C - довольно быстрый язык для начала - и компиляция с оптимизацией, вероятно, будет лучше, чем хакерство низкого уровня (особенно с тем, что вы пытаетесь сделать). Прирост производительности (если он вообще есть) при попытке сохранить исполняемый код в буфере будет очень незначительным - и это только в тех случаях, когда он не работает медленнее. Такая производительность - более чем просто компромисс между удобочитаемостью, портативностью и стабильностью, которые вы получаете в обмен.
Если вы пишете этот код для встраиваемой системы или чего-то еще, где производительность является такой сложной проблемой, вам следует подумать о написании этой части вашего приложения на ассемблере. Таким образом, вы сможете лучше контролировать поведение кода и обойти соглашения о вызовах с функциями, внутренними для этой части. Вероятно, есть причина, по которой вы не можете делать такие вещи в C: вам это никогда не нужно - и архитектура обычно не очень хорошо это поддерживает (если вообще). Указатели на функции идеально подходят для нужного вам поведения, а функции-члены еще лучше. Если вы хотите стать еще лучше, вам придется написать сборку самостоятельно, в противном случае все рухнет, и его будет почти невозможно поддерживать.
дополнение
сейчас это даже старше , но у меня была другая мысль по этому поводу:
с помощью указателей на функции в структуре, чтобы инициализировать их, вы просто загружаете их с адресом, который компилятор уже знает.
Чтобы инициализировать буфер функции, который вы хотите, вам нужно скопировать целый набор исполняемых данных в буфер. Что является хитом производительности.