相关疑难解决方法(0)

在将void*转换为任何内容时,我应该使用static_cast还是reinterpret_cast

static_cast和reinterpret_cast似乎都可以很好地将void*转换为另一个指针类型.是否有充分理由支持其他人?

c++ pointers static-cast reinterpret-cast

183
推荐指数
2
解决办法
6万
查看次数

在没有CRT,memcpy和memset内部函数的情况下构建时链接错误

我正在尝试尽可能小地构建一个应用程序,并且这样做是为了避免使用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调用:

  • lstrcpy
  • wsprintf
  • CopyMemory - 当我发表评论时,错误会切换到_memset
  • OpenFileMapping
  • MapViewOfFile
  • 的CreateFileMapping

我的问题:

  • 如果我/ Oi宣布,为什么不包含内在函数?
  • 我需要自己声明memset和memcpy吗?
    • 如果是这样,如果没有Visual Studio抱怨重新定义内部函数,我该怎么办呢?

c++ crt memset memcpy intrinsics

7
推荐指数
2
解决办法
8510
查看次数

减少Windows可执行文件的大小

我在Windows上有一个C++/MFC应用程序 - 动态链接它只有60kb静态它> 3Mb.
它是通过电子邮件分发给客户的,因此需要尽可能小.

它静态链接MFC和MSCVRT库 - 因为它修复了一些问题,我不想要更多关于缺少库的支持调用 - 特别是非常有用的'应用程序配置不正确'一个!

反正有剥离Windows exe的所有额外的MFC东西是dll,但我没有使用?
或者告诉它动态链接MSVCRT(必须存在)但静态链接MFC dll可能不是?

编辑 - 感谢将其降至1.6Mb,这将是必须的!

c++ windows dll linker mfc

5
推荐指数
3
解决办法
6102
查看次数

我可以进一步减少这个微小的MSVC++项目的"私有字节"内存使用量吗?

我出于好奇而不是真正的需要而问这个问题,但是这个微小的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个字节(尽管可能是一堆条目未使用).所以这可能无法进一步减少.或者可以吗?

堆栈和私人数据

好吧,那些已经非常小了......虽然我确实想知道它们为什么不是更小.我认为该程序没有任何接近那么多的私人数据或堆栈.

您能否建议如何使这些部分比现有的更小?


进一步发现:

  • 空白的无CRT程序使用大约204 KB
  • 呼叫CreateWindow增加420 KB
  • 调用设置键盘钩子增加156 KB
  • 避免使用CRT可节省20 KB
  • 总虚拟大小以类似方式增加
  • 不使用CRT可以节省相当多的EXE大小:从54 KB到18 KB,其中12个是资源.

因此看起来大多数内存都被Windows API占用,这似乎排除了显着的进一步减少,除非有人能想出一种方法来使钩子/托盘图标无需创建窗口(此程序已经忽略了所有消息) .

c++ windows visual-c++

5
推荐指数
1
解决办法
938
查看次数