2015-06-22 2 views
-1

Это еще один вопрос о встраивании функции.
Но я буду принимать возможные комментарии и ответы сразу:C++ Разве это не бесполезная встроенная декларация?

  1. Определение функции внутри класса делает его рядный автоматически.
  2. Такое же поведение может быть достигнуто путем маркировки функции с помощью встроенного вне класса.
  3. Встроенная функция не обязательно должна быть встроена. Это полностью до компилятора, чтобы встроить его.

Теперь мой вопрос:
Когда встраивание функции означает скопировать тело на место, где она вызывается.
Неправильно ли предположить, что компилятор не будет встроить его, если он обратится к частным или защищенным членам?
Программа в буквальном смысле не сможет получить доступ к элементам правильно?

Я хочу знать, что для меня это должно выглядеть довольно странно, если кто-то строит функцию, которая явно не может быть встроена.

Вот пример:

//Declaration 
class Controller 
{ 
public: 
    bool bHasTarget(); 

private: 
    const Object* pTarget; 
}; 


//Definition 
inline bool Controller::bHasTarget(){ 
    return !(pTarget == nullptr); //<- This cannot be inlined...Can it? 
} 
+0

Ну, прежде всего, у вас есть опечатка, которая должна быть '=='. – CoryKramer

+0

компилятор может получить доступ к чему угодно, поэтому он может встраивать все, что угодно (пока он его видит, и здесь pTarget виден компилятору) – Hcorg

+1

Что касается первого пункта, я думаю, вы имеете в виду * определение * функции, а не только объявление ее. –

ответ

1

Компилятор может получить доступ ко всем. Ограничения действительны только для программиста. Это означает, что нет никаких ограничений для компилятора для доступа к любым переменным! В конце каждая переменная просто преобразуется в адрес, к которому можно получить доступ.Поэтому для компилятора нет проблем с встроенным кодом, который вы указали!

Есть также некоторые «читы» для доступа к приватным переменным в качестве программиста. например

struct foo 
{ 
private: 
    int a; 
    int b; 
}; 

... 
foo test; 
int *cheat = reinterpret_cast<int*>(&test); 
cheat[0] = 1; //This would Change a 
... 
+0

А, я понимаю, ваш обман. (Вы уверены, что вы изменили a, а не b?) Но для этого вам нужно будет знать, как foo сконструирован, я думаю. Ну, что ж, спасибо. Я еще не знаю, как работает компилятор, но это хорошо знать :) –

+0

Да, это изменит a. 'cheat [1]' изменит b –

1

Инлайн функция может быть встраиваемыми компилятором. Это полностью до компилятора, чтобы встроить его.

Компилятор май встроенный, но он может и не быть. Это не гарантировано.

Неправильно ли считать, что компилятор не включит его, если он обращается к частным или защищенным членам?

Нет, не следует так предполагать. Доступ к частным или защищенным членам не препятствует встраиванию.

Программа в буквальном смысле не сможет получить доступ к элементам права?

Программа в буквальном смысле имеет доступ к частным и защищенным членам. Функция является членом, независимо от того, является ли она встроенной или нет.

Чтобы разработать немного, компилятор проверяет, что программа не нарушает правила доступа до того, как будет выполнена любая оптимизация наложения. После того, как проверка прошла, спецификаторы доступа имеют нулевое значение для созданной программы и не ограничивают какую-либо оптимизацию.

Пример функции может быть встроен.

Смежные вопросы