99% CPU, 3.51MB without typedef
99% CPU, 3.51MB without 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);
等等。。现在,我没有放typedef或不想放的原因是因为我可以直接分配和使用上面的指针。然而,如果我使用typedef,那么我需要创建一个所述类型的变量,并分配给它,然后使用它。这只会使我的代码从500行增加一倍,达到1000+行。
现在,当我在每个函数指针的开头添加一个typedef时,我的dll是300kb,编译时间不到5秒。。然而,如果我删除如上所示的typedef,它在编译时会飙升到99%的cpu,并输出3.51MB的dll,而编译需要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与Codeblocks 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:UsersBrandonDesktopOpenGL32ImplementationsExports.cpp -o objReleaseImplementationsExports.o
x86_64-w64-mingw32-g++.exe -O2 -std=c++11 -Wall -DBUILD_DLL -std=c++11 -c C:UsersBrandonDesktopOpenGL32main.cpp -o objReleasemain.o
x86_64-w64-mingw32-g++.exe -shared -Wl,--output-def=binReleaselibOpenGL32.def -Wl,--out-implib=binReleaselibOpenGL32.a -Wl,--dll objReleaseImplementationsExports.o objReleasemain.o -o binReleaseOpenGL32.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个函数指针(:
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.cp:
#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;
}
使用typedef
,您的头产生了许多新类型,每个类型都是函数指针类型。类型只对编译过程有用,在DLL本身中不产生任何跟踪。typedef
不产生任何全局变量。
但是,如果没有typedef
,您的头将生成一系列全局变量,每个变量都是一个函数指针。全局变量确实会在DLL中获取一个条目,从而增加文件的生成时间和最终大小。
相关文章:
- C++:TypeDef使用元组
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 为什么在使用typedef时类推导指南会失败
- dynamic_cast without RTTI
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- typedef 枚举和枚举类有什么区别?
- 在类模板中使用 typedef 时出错
- 模板类中的 typedef 语句
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- Qt - QQuickWidget setSource without freezing UI
- 向前声明指向类的 typedef 指针
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何创建 typedef 结构的前向声明
- 从 Typedef 数据类型中删除常量
- typedef vector size_type in header file
- "in-situ without memory allocation" 字符串的愚蠢实现意味着什么?
- 99% CPU, 3.51MB without typedef