首页 > 系统相关 >C++_内存模型和包

C++_内存模型和包

时间:2024-11-28 17:26:15浏览次数:8  
标签:调用 模型 系统 C++ html 内存 https Rust

C++ 内存

堆(heap)和栈(stack)是两种用于存储数据的内存区域	
    stack 栈内存 是由操作系统自动管理 栈是一种用于存储局部变量和函数调用信息的内存区域,通常采用LIFO(后进先出)结构。
	heap 堆内存 是用于动态分配的内存区域,通过显式地使用new和delete
	   C语言【malloc分配空间,free释放】C++【new分配,delete释放】	
全局/静态存储区 (.bss段和.data段)
常量存储区 (.rodata段)
代码区 (.text段)	

CMake 解决方案的构建

分为三个阶段——配置、生成和运行构建工具
Cmake 
    cmake_minimum_required()
    project()命令将检测和测试您选择的可用编译器
	
   遵循一个称为关注点分离的设计原则。
       简单来说,就是将代码分成块,将具有紧密相关功能的代码分组,同时将其他代码片段解耦,以创建强大的边界。
    工具链包括构建和运行应用程序的所有工具
	
    交叉编译—— 宿主和目标系统
	   必要步骤之一是将  
	     CMAKE_SYSTEM_NAME 和 CMAKE_SYSTEM_VERSION 变量设置为目标操作系统(CMake 文档中将其称为目标系统)
    编译测试文件
	CMake 管理依赖关系

知道和可以看到

 自定义的类 对于main函数所在的文件是可见的
 .h:头文件,是多文件编程时用来声明被引用的类、方法、常量等,但必须注意的是头文件仅仅是声明,源文件才是用来实现程序具体方法的地方
 自定义头文件:使用“xxx.h”引用,例如#include "book.h"	 
 
 系统中的头文件和库文件
    头文件,并且已经安装到了系统的标准头文件目录中, 可以直接引用它:
  find_library()
  include_directories()
  
   add_subdirectory()
   
third-party library   

  Native方法通常指的是那些用本地语言(如C、C++)编写的方法,它们可以直接与底层系统或硬件交互

默认引入-无需显式地导入

编译器和操作系统-源码
   C  源码管理以及系统配置-- 
   C++  namespace   C++ 使用手动内存管理

###编译器和包 ---操作系统  编程和执行程序的方便性并不是理所当然的,背后有着从硬件到软件多种机制的支持
##系统调用充当了用户和内核之间的边界
    Rust - cargo(Rust 的构建系统和包管理器) +  Rust 使用自动内存管理,它通过所有权(ownership)、借用(borrowing)和生命周期(lifetimes)
            Rust 标准库 std 需要通过系统调用获得操作系统的服务	
            std is available to all Rust crates by default.		 crate 是 Rust 在编译时最小的代码单位。		
    Cangjie  默认引入 core   std.core 包不需要显式导入,默认导入  core 包是标准库的核心包,提供了适用仓颉语言编程最基本的一些 API 能力
	         GC 垃圾回收
			 引入: import std.collection.*
    Python 默认引入 __built_in__ __main__
    Java 默认引入的 java.lang
    Swift文件中,使用import语句来引入需要的模块
    Go:  package main	
        标准库是 Go 自带的一组包,可以直接导入和使用
    	第三方包
    	导入本地包
Rust 标准库与核心库	
  Rust的标准库主要包括3个组件:
       语言核心库——CORE库、  核心库是与平台无关的。
	   智能指针库——ALLOC库、
	   用户态——STD库
	 CORE库是基础,ALLOC库及STD库都是基于CORE库的  
	编程语言的标准库或三方库的 某些功能会直接或间接的用到操作系统提供的系统调用
	     Rust 有一个对 Rust 语言标准库–std 裁剪过后的 Rust 语言核心库 core。
		      core库是不需要任何操作系统支持的,它的功能也比较受限,
			  但是也包含了 Rust 语言相当一部分的核心机制,可以满足我们的大部分功能需求
	Rust 语言标准库–std 是让 Rust 语言开发的软件具备可移植性的基础
	
裸机平台 (bare-metal)。这意味着在裸机平台上的软件没有传统操作系统支持。	
   裸机平台上我们要将对于标准库 std 的引用换成核心库 core
   移除移除 println! 宏及其所在的标准库 以及 交叉编译
   实现一个简陋的 panic 处理函数
  语言标准库和三方库作为应用程序的执行环境,需要负责在执行应用程序之前进行一些初始化工作,然后才跳转到应用程序的入口点

Linux 内核

在 Ubuntu 系统上,可以通过 strace 工具来运行一个程序并输出程序运行过程当中向内核请求的所有的系统调用及其返回值。
    我们只需输入 strace target/debug/os 即可看到一长串的各种系统调用。

 C# 主要用于 Windows 桌面应用程序开发 	
  在Linux系统中,进程与硬件的交互并非直接进行,而是通过系统调用来实现。
     strace 是一个强大的工具,它可以追踪进程执行时的系统调用以及接收到的信号,这对于诊断和调试程序非常有用

    如果要跟踪一个已经运行的进程,可以使用-p参数指定进程ID
	
strace
itrace  库文件调用跟踪器,Linux内核内建命令	
ptrace
ftrace

ltrace(1),  strace-log-merge(1),  
ptrace(2),  seccomp(2),  proc_pid_maps(5),  capabilities(7),  mount_namespaces(7),  vdso(7),  ovs-ctl(8),  systemd-sysext(8)	
 systemtap 是利用Kprobe 提供的API来实现动态地监控和跟踪运行中的Linux内核的工具
 Seccomp   是一种重要的Linux安全特性,用于限制进程可以执行的系统调用 
    Seccomp(全称 “Secure computing”)	 

 Berkeley Packet Filte	
 
ptrace‌是Linux系统中的一个标准系统调用,
     它允许一个进程(称为“tracer”)监视和控制另一个进程(称为“tracee”)的执行。ptrace提供了一种机制,
     使得tracer可以读取和修改tracee的内存、寄存器、信号等信息,从而实现断点调试、单步执行、系统调用跟踪等功能。
	 ptrace是gdb和 strace等调试工具的基础‌
	  拦截((intercepting))系统调用: 系统调用拦截
	 seccomp-bpf+ptrace 实现修改 系统调用原理 
https://man7.org/linux/man-pages/man7/pthreads.7.html

参考

https://github.com/xiaoweiChen/Modern-CMake-for-Cpp-2ed/tree/main	
https://cmake.org/cmake/help/latest/manual/cmake-policies.7.html	
Rust 程序设计语言  https://doc.rust-lang.org/book/
https://man7.org/linux/man-pages/man2/ptrace.2.html
Rust语言圣经(Rust Course) https://course.rs/about-book.html
https://course.rs/first-try/sth-you-should-not-do.html
Rust 核心库 https://rustwiki.org/zh-CN/core/index.html
https://strace.io/ 
 https://man7.org/linux/man-pages/man1/strace.1.html

标签:调用,模型,系统,C++,html,内存,https,Rust
From: https://www.cnblogs.com/ytwang/p/18574652

相关文章

  • 新版idea编译项目内存溢出解决办法
    1.将idea安装bin目录下的配置文件内存设置调大安装目录bin目录下的.vmoptions文件修改-Xms512m-Xmx16384m-Xss4M-XX:MaxPermSize=16384m这里我电脑16g内存,调到最大了,可以视自己电脑情况调2.将Idea编译器构建进程的共享堆大小调3.将javacompiler的usecompiler修改为......
  • TextIn文档解析表格处理模型优化,显著提升表格解析性能
    近期,TextIn通用文档解析最新推出表格处理优化版本。此前版本中,表格解析处理针对有线表格与无线表格预先分类,并基于框线进行模型预测。在运行过程中,我们发现,分类错误问题对表格解析准确率有负面影响。本次优化主要改善了表格识别效果,以统一方案替代有线表格与无线表格分类处理方法,......
  • Android内存泄漏检测与修复技巧
    内存泄漏是Android应用开发中一个常见且严重的问题。它不仅会导致应用性能下降,还可能引起应用崩溃。因此,了解如何检测和修复内存泄漏是每位Android开发者必须掌握的技能。内存泄漏的基本概念内存泄漏是指不再被程序使用的对象仍然被垃圾回收器(GC)引用,导致这些对象无法被回收,从而......
  • 多线程判断redis key导致Java hep space内存溢出
     线上经常发现报如下错误,后来发现rootcause是selectConfigitemforinstanceMap这个方法会查出几十万的结果集然后json压缩解压,写map等等操作,但是这个selectConfigitemforinstanceMap方法被很多地方调用到了,导致极有可能多线程同时都在查出几十万的结果集然后json压缩解压,写map等......
  • 基于多目标哈里斯鹰算法及模型预测控制(MPC)的储能和风电平抑波动研究(Matlab代码实现)
     ......
  • 【无功优化】“碳中和”目标下电气互联系统有功-无功协同优化模型(Matlab代码实现)
    ......
  • 文生图大模型:从文字到视觉的艺术之旅
    文生图大模型:从文字到视觉的艺术之旅在人工智能领域,近年来最引人注目的进展之一就是文生图(Text-to-Image)大模型的发展。这些模型能够将文本描述转化为高质量的图像,不仅在艺术创作、设计、娱乐等多个领域展现出巨大的潜力,也极大地推动了多模态学习技术的进步。本文将详细介......
  • 使用CLIP大模型实现视频定位:从理论到实践
    使用CLIP大模型实现视频定位:从理论到实践引言随着多媒体内容的爆炸式增长,如何高效地从海量视频中定位和检索特定内容成为了一个重要的研究课题。传统的视频检索方法通常依赖于人工标注的元数据或基于视觉特征的匹配,这些方法在处理大规模数据时存在效率低下、准确率不足等......
  • 高性能C++内存映射库mio使用心得
    背景在C++编程中,高效的数据访问至关重要,而内存映射文件(MemoryMappedFiles)提供了一种强大的工具,它允许我们直接将文件内容加载到进程地址空间,从而以极高的效率进行读写操作。今天,我们要向大家推荐一个轻量级且易于使用的开源库——mio。项目介绍mio是一个头文件式的、跨平台的......
  • 简易压缩算法一种字符串压缩表示的解压(Java & Python& JS & C++ & C )
    题目描述有一种简易压缩算法:针对全部为小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母其他部分保持原样不变.例如字符串aaabbccccd经过压缩变成字符串3abb4cd请您编写解压函数,根据输入的字符串,判断其是否为合法压缩过的字符串......