Вы не можете.Это может даже не быть четко определенной концепцией.Например, рассмотрим следующий код:
int f(int a) {
return (3*a)+1;
}
int g(int a) {
return (2*a)+1;
}
Я сомневаюсь, что это происходит на практике для этого конкретного примера, поскольку это не будет оптимизацией, но компилятору разрешено вводить блок кода, который вычисляетa+1
затем возвращается и переходит к этому блоку с каждой из точек входа f
и g
(после выполнения умножения в каждом случае).Какой тогда будет размер f
?Должен ли он включать размер общего блока?Половина этого размера?С точки зрения C ++ не имеет смысла утверждать, что функция f
имеет размер.
Кроме того, «указатель на f» может не просто быть адресом функции f.Это, безусловно, дает возможность добраться до точки входа f
, но, например, на процессоре ARM в режиме межсетевого взаимодействия указатель на функцию, состоящую из кода Thumb, фактически является адресом первой инструкции плюс 1. В действительностиlsb указателя маскируется процессором при выполнении перехода к функции, но этот бит говорит процессору переключиться в режим большого пальца, а не в режим ARM.Таким образом, значение указателя не является адресом функции (хотя он близок).В любом случае, точка входа функции не обязательно должна быть в начале ее - если ваш компилятор создает постоянные пулы или аналогичные, они могут предшествовать исполняемому коду.
Могут быть специфические для платформы способы проверкиваши исполняемые файлы (либо файлы, либо после загрузки в память, либо и то и другое) и указание, какой код связан с тем, что функционирует в C ++.В конце концов, для этого и нужна отладочная информация.Но в стандарте C ++ этого не существует, и стандарт не требует, чтобы такой механизм существовал.