Дорогой StackOverflowers,
У меня есть простая часть кода, которую я компилирую на Microsoft Visual Studio С++ 2012:
int add(int x, int y)
{
return x + y;
}
typedef int (*func_t)(int, int);
class A
{
public:
const static func_t FP;
};
const func_t A::FP = &add;
int main()
{
int x = 3;
int y = 2;
int z = A::FP(x, y);
return 0;
}
Компилятор генерирует следующий код:
int main()
{
000000013FBA2430 sub rsp,28h
int x = 3;
int y = 2;
int z = A::FP(x, y);
000000013FBA2434 mov edx,2
000000013FBA2439 lea ecx,[rdx+1]
000000013FBA243C call qword ptr [A::FP (013FBA45C0h)]
return 0;
000000013FBA2442 xor eax,eax
}
Я скомпилировал это на "Полная оптимизация" (/Obx flag) и "Любой подходящий" для расширения функции Inline. (/Ob2 флаг)
Мне было интересно, почему компилятор не встраивает этот вызов с момента его создания. У кого-нибудь из вас есть идея, почему он не встроен и если можно сделать его компилятором?
Christian
EDIT: теперь я запускаю несколько тестов, и MSVC не может встроить указатели на функции, когда:
- Переместите указатель const из класса и сделайте его глобальным.
- Переместите указатель const из класса и сделайте его локальным в основном.
- я создаю указатель не const и перемещаю его локально.
-Когда я создаю возвращаемый тип void и не даю ему никаких параметров
Я добрый, полагаю, Microsoft Visual Studio не может встроить указатели на объекты...