99% CPU, 3.51MB без typedef

Итак, у меня есть примерно 500 указателей функций, определенных в заголовке, например, например:

void (__stdcall *ptr_glAccum) (GLenum op, GLfloat value);
void (__stdcall *ptr_glActiveTextureARB) (GLenum texture);
void (__stdcall *ptr_glAlphaFunc) (GLenum func, GLclampf ref);
GLboolean (__stdcall *ptr_glAreTexturesResident) (GLsizei n, const GLuint *textures, GLboolean *residences);
void (__stdcall *ptr_glArrayElement) (GLint index);
void (__stdcall *ptr_glBegin) (GLenum mode);
void (__stdcall *ptr_glBindBufferARB) (GLenum target, GLuint buffer);
void (__stdcall *ptr_glBindTexture) (GLenum target, GLuint texture);
void (__stdcall *ptr_glBitmap) (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
void (__stdcall *ptr_glBlendFunc) (GLenum sfactor, GLenum dfactor);
void (__stdcall *ptr_glBufferDataARB) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);

Etc.. Теперь причина, по которой я не ставил typedef или не хотел, был потому, что я могу назначить и использовать указатели сверху напрямую. Однако, если я использую typedef, тогда мне нужно создать переменную указанного типа и назначить ей, а затем использовать ее. Это всего лишь удваивает мой код от 500 строк до 1000 +.

Теперь, когда я добавляю typedef в начале каждого из этих указателей на функции, моя dll составляет 300 кбайт и скомпилируется менее чем за 5 секунд. Однако, если я удалю typedef как показано выше, он резко увеличится до 99% CPU, когда компилируя и вывожу dll 3.51MB все, занимая 3-4 минуты, чтобы скомпилировать.. Его возмутительно, что одно ключевое слово вызывает столько проблем.

Внутри файла DLL def отображается:

ptr_wglUseFontBitmapsA @940 DATA
ptr_wglUseFontBitmapsW @941 DATA
ptr_wglUseFontOutlinesA @942 DATA
ptr_wglUseFontOutlinesW @943 DATA

Но с typedef эта часть "DATA" исчезла.

Любые идеи, что делает typedef настолько особенным и почему это поведение без него: S? Я использую Mingw g++ 4.7.2 с кодовыми блоками Windows-7 x64 3.7Ghz I7 8Gb Ram с выходом компилятора:

-------------- Clean: Release in OpenGL32 (compiler: GNU GCC Compiler)---------------

Cleaned "OpenGL32 - Release"

-------------- Build: Release in OpenGL32 (compiler: GNU GCC Compiler)---------------

x86_64-w64-mingw32-g++.exe  -O2  -std=c++11 -Wall -DBUILD_DLL  -std=c++11    -c C:\Users\Brandon\Desktop\OpenGL32\Implementations\Exports.cpp -o obj\Release\Implementations\Exports.o
x86_64-w64-mingw32-g++.exe  -O2  -std=c++11 -Wall -DBUILD_DLL  -std=c++11    -c C:\Users\Brandon\Desktop\OpenGL32\main.cpp -o obj\Release\main.o
x86_64-w64-mingw32-g++.exe -shared -Wl,--output-def=bin\Release\libOpenGL32.def -Wl,--out-implib=bin\Release\libOpenGL32.a -Wl,--dll  obj\Release\Implementations\Exports.o obj\Release\main.o   -o bin\Release\OpenGL32.dll -s -static -static-libgcc -static-libstdc++  -luser32 -lgdi32 -lopengl32 -lglu32 
Output size is 3.51 MB
Process terminated with status 0 (2 minutes, 39 seconds)
0 errors, 0 warnings (2 minutes, 39 seconds)

РЕДАКТИРОВАТЬ: Вся DLL (содержащая только 1/500 func-указатели по запросу):

Exports.hpp:

#ifndef EXPORTS_HPP_INCLUDED
#define EXPORTS_HPP_INCLUDED

#include <GL/gl.h>
#include <GL/glext.h>
#include "Platform.hpp"


extern Library* OriginalGL;

void (__stdcall *ptr_glAccum) (GLenum op, GLfloat value);

#endif // EXPORTS_HPP_INCLUDED

Exports.cpp:

#include "Exports.hpp"

Library* OriginalGL = nullptr;

bool __stdcall Initialized(void)
{
    char Root[MAX_PATH];
    #if defined _WIN32 || defined _WIN64
        GetSystemDirectoryA(Root, MAX_PATH);
    #ifdef _MSC_VER
        strcat_s(Root, "\\opengl32.dll");
    #else
        strcat(Root, "\\opengl32.dll");
    #endif
    #else
        strcat(Root, "/usr/lib");
        strcat(Root, "/libGL.so");
    #endif

    OriginalGL = new Library(Root);
    return  OriginalGL->FunctionAddress(ptr_glAccum, "glAccum"); //Just a thin class wrapper around GetProcAddress and LoadLibrary.
}

bool __stdcall DeInitialize(void)
{
    if (OriginalGL)
    {
        delete OriginalGL;
        OriginalGL = nullptr;
        return true;
    }
    return false;
}

extern "C" __stdcall void DetourHook_glAccum(GLenum op, GLfloat value)
{
    (*ptr_glAccum) (op, value);
}

main.cpp:

#include <windows.h>

extern "C" bool __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            break;

        case DLL_PROCESS_DETACH:
            break;

        default:
            break;
    }
    return true;
}

Ответы

Ответ 1

С typedef ваш заголовок создает много новых типов, каждый из которых является типом указателя функции. Типы полезны только для процесса компиляции и не производят никаких следов в самой DLL. typedef не создает глобальных переменных.

Однако без typedef ваш заголовок создает серию глобальных переменных, каждый из которых является указателем на функцию. Глобальные переменные принимают запись в DLL, увеличивая время производства файла и его конечный размер.