Допустим, у меня есть класс C ++, реализация которого выглядит примерно так:
// ...
MyClass::iterativeFunction() {
for (int i = 0; i < 1000000; i++) {
performAction(i);
}
}
MyClass::performAction(int index) {
// Block of code (non-inline-able)
}
// ...
На уровне C ++ я могу контролировать пространственную локальность этих методов или просто надеяться, что компилятор заметит связанные методы и оптимизирует свою сборку соответствующим образом? В идеале я хотел бы, чтобы они были рядом друг с другом, чтобы они вместе загружались в кэш инструкций, но я понятия не имею, как дать компилятору понять, что мне бы очень хотелось, чтобы это произошло.
В любом случае код не может быть запущен, пока не попадет в кеш. В любом случае это будет одинаково очевидно для CPU, куда идет поток кода, потому что поток является безусловным. Так что это не будет иметь никакого значения. Современный кэш кода не выбирается вперед в адресном пространстве, он выбирается вперед в потоке команд, следуя безусловным переходам и предсказывая условные переходы по мере необходимости.
Так что нет причин беспокоиться об этом. Это не будет иметь никакого значения.
Технически говоря, нет. Тем не менее, на современных процессорах вы не в общем-то Вам нужно беспокоиться о кеше инструкций почти так же, как о кеше данных, если только у вас нет очень большого исполняемого файла или действительно ужасающих веток повсюду.
Причина в том, что строки кэша имеют длину всего около 64 байтов, что означает, что если ваши методы имеют размер более 64 байтов (и они есть), их необходимо будет загрузить в несколько записей кэша, даже если они находятся непосредственно рядом друг с другом в физической памяти.
Если вам нужен такой уровень контроля и оптимизации, то C ++ — это не тот язык, который вам подходит.
Но фактический ответ на ваш вопрос — «Нет».
Нет, насколько я знаю, вы не можете указать местоположение ваших методов.
Если бы C ++ разрешал вложенные процедуры, это было бы одним из способов гарантировать, что вызываемая процедура была локальной.