Есть либа (A-Library), предоставляющая некоторые функции. Она коннектится к другой либе (B-Library) и получает некую структуру:
typedef struct
{
int a;
int b;
...
char z[256];
} AAA;
# In A-Library
int SomeFunc()
{
AAA * aaa = GetAAAFromB();
/// Do stuff
}
int SomeMoreFunc()
{
AAA * aaa = GetAAAFromB();
/// Do more stuff
}
int SomeEvenMoreFunc()
{
AAA * aaa = GetAAAFromB();
/// Do even more stuff
}
Понятно, что може например вынести ее глобально (как вариант через static):
# In A-Library
AAA * aaa = NULL;
int SomeFunc()
{
if (!aaa) aaa = GetAAAFromB();
/// Do stuff
}
int SomeMoreFunc()
{
if (!aaa) aaa = GetAAAFromB();
/// Do more stuff
}
int SomeEvenMoreFunc()
{
if (!aaa) aaa = GetAAAFromB();
/// Do even more stuff
}
Вопрос - как с наименьшим оверхедом проинициализировать ее? Нужно:
1. Обойтись без LibraryAInit функции
2. Обойтись без компиляторого-зависимых решений (need c89)
3. Обойтись без костылей в виде проверки в каждой функции, функций много и выглядит костыльно.
4. Представить что GetAAAFromB выполняется долго.
Может как-то намутить с адресами на функцию? Типа сначала адрес на GetAAAFromB, а потом на func() { return aaa; } ? Какие еще есть идеи?