优化C++程序编译效率的实例

编译时计算优化:避免重复计算 本文探讨了在C++编译时计算中避免重复调用std::vector的优化方法。当需要将编译时计算的std::vector转为std::array时,直接方法会导致重复调用问题。文章分析了当前C++标准(C++20及之前)的限制,提出三种解决方案:等待C++26的提案P3032、使用预计算结果或依赖编译器优化,并通过consteval示例展示如何避免重复计算。虽然目前没有完美方案,但合理利用现有特性可以提升效率,未来版本有望根本解决这一问题。 阅读详情
1)自定义程序的入口
(2)合并区段
(3)不用调malloc,free等函数
(3)不用cout来输出,cin来输入
(4)如果调用了很多库函数如memset,stycpy等等
的话,请导入msvcrt.lib,不然编译器会在程序里面
导入静态库,这样的话程序就会大很多。。
(5)window 编程不用mfc...
减少程序运行内存占用量可以调用
SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1);

----------sample.cpp---------------------
#include <windows.h>
#include "sample.h"
#include "mydll.h"
#include "resource.h"
//这下面自定义函数入口
#pragma comment(linker, "/ENTRY:EntryPoint")
#pragma comment(linker,"/ALIGN:0x400")
//设置区段属性,跟区段在内存起始地址
//这里面要加写入的权限,不然程序就运行不了了
//E为执行,R为可读,W为可写
//更多的说明请参见msdn
#pragma comment(linker,"/SECTION:.text,ERW /ALIGN:0x1000")
//下面合并区段,
#pragma comment(linker,"/merge:.data=.text")
#pragma comment(linker,"/merge:.rdata=.text")
//下面导入函数
#pragma comment(lib,"mydll.lib")
//下面是函数的入口
//得到WinMain里面的几个参数
//HINSTANCE hInstance=GetModuleHandle(NULL)
//LPSTR lpCmdLine= GetCommandLine()
//int nCmdShow  这个可以自己填
void EntryPoint()
{
  HINSTANCE hInstance;
  hInstance=GetModuleHandle(NULL);
  Sample pro(hInstance);
  DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG),NULL,(DLGPROC)Sample::DialogProc,(LPARAM)&pro);
}
INT_PTR CALLBACK Sample::DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  static Sample *pro;
  switch(message)
  {
  case WM_INITDIALOG:
    pro=(Sample *)lParam;
    pro->hwnd=hwnd;
    pro->Init();
    break;
  case WM_COMMAND:
    pro->WndPro_Command(wParam,lParam);
    break;
  case WM_CLOSE:
    pro->WndPro_Close();
    break;
  case WM_TIMER:
    //这里每秒钟触发一次
    //来减少内存占用量
                     //试着在任务管理器里面看一下,sample.exe内存占用量是不是只有200多k,在我这里是这样的
    if(wParam==100)
    {
      SetProcessWorkingSetSize(GetCurrentProcess(),
        -1,-1);
    }
    break;
  }
  return 0;
}
Sample::Sample(HINSTANCE hi)
{
  this->hInstance=hi;
}
int Sample::WndPro_Command(WPARAM wParam,LPARAM lParam)
{
  switch(wParam)
  {
  case IDOK:
    this->LoadDll();
    break;
  case IDCANCEL:
    this->WndPro_Close();
    break;
  }
  return 0;
}
int Sample::WndPro_Close()
{
  EndDialog(hwnd,0);
  return 0;
}
int Sample::Init()
{
  SetTimer(hwnd,100,100,NULL);
  return 0;
}
int Sample::LoadDll()
{
  test(hwnd);
  return 0;
}
UINT malloc_(size_t num)
{
  return (UINT)VirtualAlloc(NULL, num,MEM_RESERVE |MEM_COMMIT,PAGE_EXECUTE_READWRITE);
}
void free_(void * p)
{
  VirtualFree(p,NULL,MEM_RELEASE);
}
void ZeroMem(char * mem,int len)
{
  for(int i=0;i<len;i++)
    mem[i]=0;
}
-------------------------------
----------sample.h--------
//下面是主函数的类
class Sample
{
public:
  static INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
  Sample(HINSTANCE);
private:
  HINSTANCE hInstance;
  HWND hwnd;
  int WndPro_Command(WPARAM,LPARAM);
  int WndPro_Close();
  int Init();
  int LoadDll();
};
///-->下为精简的库函数
//分配内存最好不用库函数malloc,
//不要用cout 来输出
//如果你调用了很多库函数的话
//请在导入 msvcrt.lib
UINT malloc_(size_t);//分配内存
void free_(void *);//释放内存
void ZeroMem(char *,int);//清零
-------------------------------
---------mydll.cpp-----------
#include <windows.h>
#include "mydll.h"
#pragma comment(linker, "/ENTRY:DllEntry")
#pragma comment(linker,"/ALIGN:0x400")
#pragma comment(linker,"/SECTION:.text,ERW /ALIGN:0x1000")
#pragma comment(linker,"/merge:.data=.text")
#pragma comment(linker,"/merge:.rdata=.text")
BOOL APIENTRY DllEntry()
{
  return 1;
}
INT APIENTRY test(HWND hwnd)
{
  MessageBox(hwnd,"调用dll"," ",0);
  return 0; 
} 
 
内存清理工具 内存清理工具 Windows 内存,程序是控制台应用程序,用C/C++写的。 使用EmptyWorkingSet/SetProcessWorkingSetSize实现内存清理与优化 程序只是对清理工具实现原理的一个展示 立即下载

相关推荐

SetProcessWorkingSetSize

用于内存回收 解决C#应用程序占内存大问题

malloc_trim和SetProcessWorkingSetSize两个神奇的内存相关函数

它们两个其实没有什么关系,相似之处是调用这两个函数后内存会有明显的下降,但是原理完全不同。 malloc_trim linux平台的函数,官方的解释是:从堆释放可用内存。 在程序中堆上new或者malloc的内存我们都会delete和free掉,由于linux的机制它们并没有立即将释放的内存归还给操作系统,这个也是正常的不用担心,因为linux会充分利用内存提高系统的性能。正常情况下我们也不会调用这个函数,只要正常调用了delete和free就可以了。但是如果你内存不够,或者某个操作占用了太高的内存,之后又

Keep It Simple, Stupid 3955

Net程序减少内存占用的方法_SetProcessWorkingSetSize

Net程序减少内存占用的方法_SetProcessWorkingSetSize

SetProcessWorkingSetSize减少内存占用

[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")] public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize); /// /// 释放内存 /// public static void

迪克程序 1891

激光可燃气体传感器DIY指南:从TDLAS原理到STM32实战(附代码)

本文详细介绍了如何DIY激光可燃气体传感器,从TDLAS原理到STM32实战,包括硬件选型、光路搭建、电子系统设计和嵌入式软件开发。通过TDLAS技术实现高灵敏度甲烷检测,适合工业安全和环境监测应用。附有完整代码和实用调试技巧,帮助开发者快速掌握光学气体检测技术。

fanta的博客 440

汇川伺服驱动器参数优化实战指南

本文详细介绍了汇川伺服驱动器参数优化的实战技巧,涵盖控制模式选择、电子齿轮比调整、刚性匹配与振动抑制等关键内容。通过实际案例和实用技巧,帮助工程师快速掌握伺服驱动器参数调校方法,提升设备运行精度和稳定性。特别针对高精度定位和高速响应场景提供了专业指导。

weixin_29070721的博客 735

C# 语言调用 “WINAPI SetProcessWorkingSetSize” 函数转储闲置内存到虚拟内存上面。

通常不建议C#语言调用该函数来减少闲置内存,因为它并不能减少实际进程占用得内存数量,算是一种自欺欺人得做法,并且调用它也会潜在得导致.NET程序得性能降低(假设需要从虚拟内存重新换入物理内存页上面) 但对于运行在用户PC上面得客户端类型程序是可以执行该函数得,因为我们知道.NET Framework(MSCOREE CLR)平台虚拟机非常占用内存,比不了JAVA JVM得功耗,但也并不算低,.NET Core CLR Hosting 内存功耗就会好少不少,当然,我们仍旧可以主动得要求Heap GC系统尽快

liulilittle的博客 868

【CV论文精读】【协同感知综述】Collaborative Perception for Autonomous Driving :Current Status and Future Trend

感知是自动驾驶系统的关键模块之一,近年来取得了很大进展。然而,单个车辆的有限能力导致感知性能提高的瓶颈。为了突破个体感知的局限,协作感知被提出,它使车辆能够共享信息来感知视线和视野之外的环境。本文综述了有前途的协作感知技术的相关工作,包括介绍了基本概念,概括了协作模式,总结了协作感知的关键要素和应用。最后,我们讨论了这一研究领域面临的挑战和问题,并给出了一些潜在的进一步方向。

weixin_44184852的博客 4690

使用 SetProcessWorkingSetSize 降低程序内存

在项目中对程序性能优化时,发现用SetProcessWorkingSetSize() 方法使内存降低了很多,于是查阅了相关的资料如下。 一 SetProcessWorkingSetSize 的工作原理 以下来自:http://blog.youkuaiyun.com/zlt982001/archive/2005/08/28/466879.aspx 那么我的程序为什么能够将占用的内存移至虚拟内存

蓝叶菱的专栏 2446

Web前端开发技术:实验14-16

实验14 1. 编写JavaScript程序实现“九九乘法口诀”表,如图14-40所示。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>九九乘法表</title> </head> <body> <h1>九九乘法表</h1> </body> <scri

KslgmrDry的博客 1万+

6.6kW的车载充电器(On-Board Charger, OBC)电路分析

图片展示了6.6kW的车载充电器(On-Board Charger, OBC)电路,其中包含双向和单向两种拓扑结构。接下来我们将深入分析每个模块的设计、原理及其优势,以帮助理解不同结构在实际应用中的选型和应用。

weixin_43199439的博客 5663

了解#pragma comment

#pragma comment( comment-type [,"commentstring"] ) 该宏放置一个注释到对象文件或者可执行文件。 comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。 commentstring是一个提供为comment-type提供附加信息的字符串, Remarks: 1、compiler:

th0624的专栏 812

【图像分类】卷积神经网络之VGGNet网络模型实现花卉图像识别(附代码和数据集,PyTorch框架)

卷积神经网络之VGGNet网络模型实现花卉图像识别(附代码和数据集,PyTorch框架)

学无止境、积少成多、厚积薄发 2430

【C++学习】——(二)编译与链接

开篇 ​C++有个最大的特点,那便是编译型语言,相比于Python这种解释型语言,C++在编译阶段就进行了许多处理,在执行阶段便具有高效性,本篇主要讲解C++中的编译与链接; 编译与链接模型 1、一开始的C++是一个简单的加工模型,如下图所示: 这样会存在一些问题: 无法处理大型程序 加工耗时较长 即使少量修改,也需要全部重新加工 2、为了解决以上问题,引入了分块处理的方式: 编译链接模型的好处: 编译耗资源但一次处理输入较少 链接输入较多但处理速度快 便于程序修改(只需修改一部分) 在引入分块

weixin_40620310的博客 1938

【100%通过率】华为OD机试真题 Python 实现【投篮大赛】【2022.11 Q4 新题】

你现在是一场采用特殊赛制投篮大赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中ops[i]是你需要记录的第i项操作,ops遵循下述规则: 整数x-表示本回合新获得分数x “+” – 表示本回合新获得的得分是前两次得分的总和。 “D” – 表示本回合新获得的得分是前一次得分的两倍。 “C” – 表示本回合没有分数,并且前一次得分无效,将其从记录中移除。 请你返回记录中所有得分的总和。

MISAYAONE的博客 1万+

【YOLOs-CPP-图像分类部署】04-项目优化(加速部署)

本文详细介绍了将YOLO图像分类C++部署项目从CMake迁移到Visual Studio控制台应用的全过程。针对低配CPU性能瓶颈问题,作者通过替换多线程HPP代码为官方实现,并采用448x448固定输入尺寸优化推理速度。项目配置包含OpenCV和ONNX Runtime环境设置,实现了图像批量处理、分类结果显示及结果日志输出功能。关键步骤包括依赖库配置、DLL部署和代码调试,最终在Windows平台成功实现高效CPU推理。该方案显著提升了低配硬件的兼容性,为图像分类任务提供了稳定的部署解决方案。

深耕CV 354

【C/C++】使用 g++ 编译器编译 C++ 程序的完全指南

本文介绍了 `g++` 编译器的使用方法和常见参数解释,帮助您编译和构建 C++ 程序。

小子宝丁的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++编译器优化-返回值优化

本文转自http://www.cnblogs.com/Azhu/archive/2012/07/14/2591489.html、http://www.programlife.net/cpp-return-value-optimization.html和http://blog.sina.com.cn/s/blog_5dbb2c470100xapn.html,转载至此仅为方便学习参考。 (一)返

wei.zhou的专栏 3655

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

一文搞懂C++临时对象优化 附详细样例

C语言和C++在程序执行中,都是通过调用一系列的函数来实现的。并且,很多时候,编译器会帮助我们做一系列的事情,比如(在编译类的成员方法的时候,编译器默认添加 this 指针,以此来确定是哪一个对象调用了该成员方法)。得益于编译器或者说系统帮助我们做的一系列事情,我们可以更加方便地使用C++。但是凡事有利必有弊,因为系统有时候会自己调用一系列的函数,从另一个角度来说,也一定程度上降低了效率。 而我们想要提高C++的执行效率,就需要了解程序(主要是对象)使用过程中都调用了哪些方法。VS2019 x86环境下,编

哇咔咔的博客 640

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c++ 之模版实例化

它的 foo<int>的具体定义就是编译器生成的、针对int} // 这就是 foo<int> 的“具体定义”而我们通过显式实例化定义(explicit instantiation definition)// 显式实例化定义:生成 foo<int> 的具体代码这行代码不是声明,而是命令👉 “编译器,请现在就为foo<int>生成实际的函数体!// foo.h// foo_inst.cpp ← 只能有一个这样的文件!// 👇 这就是“具体的定义”!// 生成 foo<int>

老赵的博客 640

C++之RVO返回值优化

什么是RVO优化 RVO的全称是Return Value Optimization。RVO是一种编译器优化技术,可以把通过函数返回创建的临时对象给”去掉”,然后可以达到少调用拷贝构造的操作目的, 它是C++11标准的一部分。 如果编译器明确知道函数会返回哪一个局部对象,那么编译器会把存储这个局部对象的地址和存储返回值临时对象的地址进行复用,也就是说避免了从局部对象到临时对象的拷贝操作。这就是RVO。 main.cpp #include <iostream> using namespace std

u012944685的专栏 4836

C++编译器优化之RVO

写这篇文章纯属意外收获. 先看一段代码: 在这段代码中定义了构造函数,拷贝构造函数,移动构造函数,赋值构造,移动赋值构造,以及析构函数. #include <iostream> using namespace std; class A { public: A() { cout << "constructor\n" <<flush; } A(const A &a) { cout << "c

weixin_47387060的博客 576

如何利用Bloaty终极指南:快速识别并优化C++模板实例化代码重复问题

Bloaty是一款强大的二进制大小分析工具,能够帮助开发者深入了解程序体积构成,尤其擅长识别C++模板实例化导致的代码重复问题。本文将详细介绍如何使用Bloaty定位并优化这类问题,让你的程序更加精简高效。 ## 为什么C++模板实例化会导致代码膨胀? 🤔 C++模板机制虽然提供了代码复用的便利,但也可能带来意想不到的体积问题。当模板在不同编译单元中被实例化时,很容易产生重复的代码。这种重复

gitblog_00998的博客 1075

C++14的新特性

C++14作为C++标准的重要补充,其在性能和便捷性方面的改进,为开发者带来了极大的便利。随着编译器对C++14特性的不断完善和优化,我们可以期待C++在未来的应用中将发挥更大的作用。C++14作为C++11的后续版本,继续延续了这一趋势,为开发者带来了更多便捷的特性,同时在性能方面做出了重要改进。:C++14对lambda闭包进行了优化,允许捕获this指针的副本,提高了lambda在异步操作中的性能。:变量模板的引入,使得模板化变量成为可能,进一步丰富了模板元编程的能力。

scoone的博客 824

C++对象模型(三):Program Transformation Semantics (程序转换语义学)

本文是Inside The C++ Object Model Chapter 2 部分的读书笔记。是讨论编译器调用拷贝构造函数时的策略(如何优化以提高效率),侯捷称之为"程序转化的语义学" 或者说是是关于编译器对于程序是如何进行有效转化或者说翻译,以实现C++的语法机制。主要来说有以下几种Semantics: 1) 明确的初始化操作(Explicit Initialization) 比如定义

anzhsoft的技术专栏 1万+

编译期优化全解析,深度解读C++模板元编程的核心机制与应用

掌握编译期优化核心技术,本文深入解析C++模板元编程入门与实践,涵盖类型计算、递归展开与SFINAE等核心机制。适用于高性能库设计与零成本抽象,提升编译期计算效率,值得收藏。

CodePulse的博客 801
上一篇: 简析利用调试寄存器实现内核函数的HOOK
下一篇: 分析蠕虫及压缩的网络流量
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值