Вы не можете. Это может быть даже не четкое понятие. Например, рассмотрим следующий код:
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 указателя замаскирован CPU при выполнении перехода к функции, но этот бит сообщает CPU переключиться в режим Thumb, а не в режиме ARM. Таким образом, значение указателя не является адресом функции (хотя оно близко). Во всяком случае, точкой входа функции необязательно должно быть в начале ее - если ваш компилятор создает постоянные пулы или аналогичные, они могут предшествовать исполняемому коду.
Возможно, существуют определенные для платформы способы изучения ваших исполняемых файлов (либо файлов, либо после загрузки в память, либо и того и другого) и определения того, какой код связан с функциями C++. В конце концов, это то, что нужно для отладочной информации. Но в стандартном C++ этого не существует, и стандарт не требует наличия такого механизма.
Вы имеете в виду длину или размер кода в памяти? – marcog
Какой размер точно? Размер исходного кода C++ или размер машинного кода? В чем цель вообще? – Flinsch
@ x1234x: вы хотите уточнить, что вы на самом деле хотите сделать * с этим ... Как было отмечено несколькими ответами, размер * в байтах * почти наверняка невозможно получить надежно, а для многих компиляторов, вероятно, бессмысленно даже если вы можете это определить - но, скорее всего, есть более простой и надежный способ получить то, что вы хотите без этого. – Shog9