2015-05-20 3 views
0

я следующий сценарием У меня есть файл .cpp (мне нужно использовать эти на самом деле в Objective-C++ .mm):ехЬегп встроенных функций в C++ для выполнения

#include <utility> 

bool g_ready; 
std::pair<int, bool> g_pair; 

extern inline bool& isReady() 
{ 
    return g_ready; 
} 
extern inline std::pair<int, bool>& GetPair() 
{ 
    return g_pair; 
} 

extern inline void SetPair(int i, bool b) 
{ 
    g_pair.first = i; 
    g_pair.second = b; 
} 

И тогда я использую этот somehere в другом .cpp файле:

#include <iostream> 

extern inline bool& isReady(); 

extern inline std::pair<int, bool>& GetPair(); 

extern inline void SetPair(int i, bool b); 

void update() 
{ 
    if (isReady()) 
    { 
     SetPair(5, false); 
     std::cout << "<" << GetPair().first << "," << GetPair().second << ">" << std::endl; 
     SetPair(1, true); 
     std::cout << "<" << GetPair().first << "," << GetPair().second << ">" << std::endl; 
    } 
} 

Мне нужно, чтобы эти функции вызывались в цикле обновления, называемом каждым фреймом. Это оптимальное решение. Будут ли они на самом деле встроены без каких-либо затрат времени на выполнение?

Редактировать: Производственный компилятор Clang для iOS.

ответ

0

Это оптимальное решение.

No. Встроенные функции должны быть определены в каждой единице перевода, которая использует их, независимо от того, имеют ли они внешние связи (которые они будут по умолчанию, без необходимости указания extern). По этой причине ваш код дает мне ссылку.

Будут ли они наклонены без каких-либо затрат времени на выполнение?

Это зависит от компилятора. Короткие inline функции (которые должны быть определены в том же блоке, что и вызов) обычно будут; функции в других единицах перевода могут быть только встроены, если компиляторы поддерживают оптимизацию времени привязки.

+0

Я редактировал код онлайн. Возможно, я сделал что-то не так, но моя версия компилируется и работает для меня. В моем случае эти функции будут использоваться только один раз, потому что мне нужно регистрировать событие до того, как будет создан экземпляр регистратора. Поэтому я не могу придумать лучшего решения. Мы используем MSVC для разработки, но выпуск продукции будет составлен Clang. – Zingam

+0

@ Zingam: Некоторые компиляторы могли бы связать его, несмотря на нарушение ODR, другие - нет. Вам нужно будет определить встроенные функции либо в исходном файле, который их использует (если есть только один), либо заголовок, включенный в каждый файл, который их использует, для того, чтобы это можно было выполнить переносимо. –