static_cast和reinterpret_cast似乎都可以很好地将void*转换为另一个指针类型.是否有充分理由支持其他人?
我正在尝试尽可能小地构建一个应用程序,并且这样做是为了避免使用Win API调用而不是标准的C/C++调用来使用CRT.不幸的是,我仍然遇到一个链接器错误:
Error 2 error LNK2001: unresolved external symbol _memcpy
Run Code Online (Sandbox Code Playgroud)
我不会在我的代码中的任何地方调用memcpy,所以我假设其中一个Windows函数正在调用它.打开内部函数会给出一个未解析的符号_memset,我也没有使用它.根据我的理解,memcpy和memset都应包含在启用的内部函数中.由于我的代码太长而无法发布,以下是我的程序中的Win API调用:
我的问题:
我在Windows上有一个C++/MFC应用程序 - 动态链接它只有60kb静态它> 3Mb.
它是通过电子邮件分发给客户的,因此需要尽可能小.
它静态链接MFC和MSCVRT库 - 因为它修复了一些问题,我不想要更多关于缺少库的支持调用 - 特别是非常有用的'应用程序配置不正确'一个!
反正有剥离Windows exe的所有额外的MFC东西是dll,但我没有使用?
或者告诉它动态链接MSVCRT(必须存在)但静态链接MFC dll可能不是?
编辑 - 感谢将其降至1.6Mb,这将是必须的!
我出于好奇而不是真正的需要而问这个问题,但是这个微小的MSVC++程序的内存使用能否进一步降低?BitBucket上的源文件.
该程序编译为"优化代码大小".它会创建一个仅限消息的窗口并设置一个键盘钩子,显示一个托盘图标以响应按下Caps/Num/Scroll Lock键.
根据VMMap,私有字节分配如下:
260 KB: Image
252 KB: Heap
240 KB: Page Table
24 KB: Stack
24 KB: Private Data
------
800 KB TOTAL
Run Code Online (Sandbox Code Playgroud)
图片
应用程序本身仅使用20 KB; 其余的由十几个DLL消耗.看起来这个小到它.
堆
该程序仅在堆上分配大约3 KB的数据:恰好是某个类的三个实例.其余部分必须来自CRT和/或标准OS代码.
这可能会减少吗?这看起来像是储蓄的主要候选人.
页表
该程序的总虚拟大小为44 MB,大约为11k页.这是平均每页22个字节(尽管可能是一堆条目未使用).所以这可能无法进一步减少.或者可以吗?
堆栈和私人数据
好吧,那些已经非常小了......虽然我确实想知道它们为什么不是更小.我认为该程序没有任何接近那么多的私人数据或堆栈.
您能否建议如何使这些部分比现有的更小?
进一步发现:
CreateWindow增加420 KB因此看起来大多数内存都被Windows API占用,这似乎排除了显着的进一步减少,除非有人能想出一种方法来使钩子/托盘图标无需创建窗口(此程序已经忽略了所有消息) .
c++ ×4
windows ×2
crt ×1
dll ×1
intrinsics ×1
linker ×1
memcpy ×1
memset ×1
mfc ×1
pointers ×1
static-cast ×1
visual-c++ ×1