Como armazenar e chamar uma função compilada em C / C ++?

Para fins de otimização de nível muito baixo, seria útil para mim se eu pudesse armazenar uma função compilada dentro de uma variável diretamente,não um ponteiro para uma função. Isto é, se eu tenho uma função foo, eu quero fazer um buffer de char grande o suficiente para manter as instruções de máquina geradas para foo, e então poder chamar foo de alguma forma dizendo que C pule a execução para o conteúdo daquele buffer (suponha que eu tenha um compilador intrínseco para garantir que o buffer de caracteres esteja alinhado adequadamente à minha arquitetura). Idealmente, eu gostaria de fazer isso mantendo o uso de assembly no mínimo (eu percebo que alguns podem ser necessários).

Minha melhor solução até agora seria compilar um programa que tenha apenas a função que eu quero montar com o GCC, então compilar para código de máquina, então usar os endereços do assembly de saída para extrair o código de máquina desejado do executável, preencher manualmente o buffer com que no meu programa, em seguida, use assembly in-line para ir para o endereço inicial do buffer. Isso é mais trabalhoso e manual do que eu gostaria.

Eu não preciso compilar novas funções em tempo de execução, basta ter o buffer contendo instruções correspondentes a diferentes funções já compiladas durante o tempo de execução. Por exemplo. Eu poderia ter 3 funções compiladas e 1 buffer. As 3 funções são conhecidas em tempo de compilação, mas em tempo de execução o buffer pode corresponder a qualquer um dos 3 em momentos diferentes.

Edit: Para esclarecer o que haveria a ganhar: Eu tenho uma estrutura de que este buffer será um membro, e vários ponteiros para instâncias dessa estrutura. O buffer de cada estrutura pode conter uma função compilada diferente. Se eu fosse usar um ponteiro de função em vez do buffer, eu teria que carregar o ponteiro de função da estrutura, em seguida, deref o ponteiro de função. Com o buffer, posso simplesmente pular o contador de programa para um deslocamento (a localização relativa do buffer) da base da estrutura. É um nível a menos de indireção. Para funções muito pequenas, isso pode ser uma economia.

Edit 2: Mais esclarecimentos:

Com um ponteiro de função:

Carregar ponteiro de & struct + offsetof (ponteiro)Salte para a localização contida no ponteiro

Com um buffer que contém código de máquina:

Ir para & struct + offsetof (buffer)

O segundo é menos passos.

questionAnswers(12)

yourAnswerToTheQuestion