C++学习(18)

#学习自用#

模板

模板解决代码复用

我们看一个简单的例子。

	#include<iostream>
	#include<string>
	using namespace std;
	void print(string str)
	{
		cout << str << endl;
	}
	void print(int str)
	{
		cout << str << endl;
	}
	void print(float str)
	{
		cout << str << endl;
	}
	int main()
	{
		print("odd");
		print(1);
		print(3.5f);
	}

要打印不同的类型,就要传入不同的参数,可以用函数重载实现,但是这样复制粘贴的代码看起来很臃肿,像这种几个代码相同,只是传入的参数不同的函数就可以用模板来实现。

#include<iostream>
#include<string>
using namespace std;
template<typename T>
void print(T value)
{
	cout << value << endl;
}
int main()
{
	print("odd");//print<string>("odd")
	print(1);
	print(3.5f);
	cin.get();
}

void print(T value)  只是模板并不是真正的函数,当我们在main函数中调用print时,函数才真正创建。

模板生成类

#include<iostream>
#include<string>
using namespace std;

template<typename T,int N>
class Array
{
private:
	T m_Array[N];
public:
	int getsize()const { return N ; }
};
int main()
{
	Array<int,5> array;//创建一个Array类,所有的T替换成int,所有的N替换成5
	cin.get();
}

如果不使用模板,那么在栈上创建的数组在编译期间就必须知道它的大小,而使用模板在调用时才会创建。

内存分配

#include<iostream>
#include<string>
using namespace std;
struct Vector
{
	int x, y, z;
	Vector()
		:x(10),y(11),z(12) {}
};

int main()
{
	//栈上分配
	int value = 5;
	int array[5] = { 1,2,3,4,5 };
	Vector v1;

	//堆上分配
	int* hvalue = new int(5);
	int* harray = new int[5];
	harray[0] = 1;
	harray[1] = 2;
	harray[2] = 3;
	harray[3] = 4;
	harray[4] = 5;
	Vector* hv1 = new Vector();

	cin.get();
	delete hvalue, hv1;
	delete[] harray;
}

第一个部分是在栈上分配内存,第二个部分是在堆上分配内存(用关键字 new ),打上断点进行调试,在内存中可以看见value、array、v1 的位置其实挨得很近,他们之间的字节( cc )是在debug模式运行下添加的安全守卫,确保变量溢出时不会影响到其他变量。

在栈上分配内存时,实际上是栈顶部的指针移动变量所需字节大小, 我用的VS2022,变量是从低地址向高地址分配的,其他版本可能不同。

在堆上分配则上面这些特征。new 实际上是调用了 malloc 。简单来说,当启动程序时我们会得到一定数量的物理ram;程序会维护一个叫空闲列表的东西,用于追踪那些内存块是空闲的,位置在哪以及被分配的情况。

在代码生成的汇编中我们可以看出,栈上分配只是一条简单的cpu指令,堆上分配则多出了很多语句,所以栈上分配的速度要快许多,实际上,不是必须在堆上分配(变量需要超出函数作用域的寿命,或者要分配的内存很大),采用栈上分配是最好的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/704067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS】鸿蒙入门学习

一、开发前的准备 &#xff08;一&#xff09;HarmonyOS 开发套件介绍 &#xff08;二&#xff09;开发者主要使用的核心套件 主要为代码开发阶段会使用到的 DevEco Studio、ArkTS、ArkUI三个工具。 &#xff08;三&#xff09;熟悉鸿蒙官网 1、网址 https://developer.hua…

第19篇 Intel FPGA Monitor Program的使用<二>

Q&#xff1a;Intel FPGA Monitor Program里集成的Computer System是什么架构的呢&#xff1f; A&#xff1a;我们以DE2-115的DE2-115_Computer System为例介绍&#xff0c;简单说DE2-115_Computer System就是一个Qsys系统&#xff0c;该系统包含Nios II处理器以及DE2-115开发…

windows 下 docker 入门

这里只是具体过程&#xff0c;有不清楚的欢迎随时讨论 1、安装docker &#xff0c;除了下一步&#xff0c;好像也没有其他操作了 2、安装好docker后&#xff0c;默认是运行在linux 下的&#xff0c;这时我们需要切换到windows 环境下&#xff0c; 操作&#xff1a;在右下角d…

C#——方法函数详情

方法(函数) C#是面向对象的,所以C#中的方法也是相对于对象来说的,是指某个对象的行为,比如,有一个动物的类,兔子是这个动物类里的一个对象,那么跳这个行为就是兔子这个对象的方法了.其实也就是C中的函数(C是面向过程的,叫函数). 方法: 就是把一系列相关的代码组织到一块 用于…

人工智能--制造业和农业

欢迎来到 Papicatch的博客 文章目录 &#x1f349;人工智能在制造业中的应用 &#x1f348; 应用场景及便利 &#x1f34d;生产线自动化 &#x1f34d;质量控制 &#x1f34d;预测性维护 &#x1f34d;供应链优化 &#x1f348; 技术实现及核心 &#x1f34d;机器学习和…

CSS入门到精通——表格样式

目录 表格边框 任务描述 相关知识 表格边框 折叠边框 编程要求 表格颜色、文字与大小 任务描述 相关知识 表格颜色 表格文字对齐与文字粗细 表格宽度和高度 任务要求 表格边框 任务描述 本关任务&#xff1a;在本关中&#xff0c;我们将学习如何使用CSS设置表格样…

2024年汉字小达人活动还有4个多月开赛:来做18道历年选择题备考

结合最近几年的活动安排&#xff0c;预计2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地准备汉字小达人比赛呢&#xff1f; 我的建议是充分利用即将到来的暑假&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0…

【吊打面试官系列-Mysql面试题】MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

大家好&#xff0c;我是锋哥。今天分享关于 【MySQL 数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL 数据库作发布系统的存储&#xff0c;一天五万条以上的增量…

【Python】Python 2 测试网络连通性脚本

文章目录 前言1. 命令行传参2. 代码 前言 最近在只有python2的服务器上部署服务&#xff0c;不能用三方类库&#xff0c;这里出于好奇心学习下python。这里简单做个脚本&#xff0c;实现了检验网络连通性的功能&#xff08;类似于curl&#xff09;。 1. 命令行传参 使用命令…

Apple ID已成历史,在ios18中正式更名为Apple Account

随着iOS18的首个开发者预览版成功推送&#xff0c;众多热衷于尝鲜的用户已纷纷升级并开启全新体验。在这个版本中&#xff0c;备受瞩目的Apple ID正式迎来了它的进化——更名为Apple Account&#xff0c;并且拥有了中文名称“Apple账户”或简称“苹果账户”。 不过目前官网还称…

桌面应用开发框架比较:Electron、Flutter、Tauri、React Native 与 Qt

在当今快速发展的技术环境中&#xff0c;对跨平台桌面应用程序的需求正在不断激增。 开发人员面临着选择正确框架之挑战&#xff0c;以便可以高效构建可在 Windows、macOS 和 Linux 上无缝运行的应用程序。 在本文中&#xff0c;我们将比较五种流行的桌面应用程序开发框架&…

高效数据架构:分表流程实践

前言 ​ 随着业务的不断扩展&#xff0c;数据量激增成为不可避免的现象。当数据量达到某一临界点时&#xff0c;单一的数据表可能无法承载如此庞大的数据量&#xff0c;此时就需要考虑进行分库分表的策略。尽管业界普遍认为数据量达到1000万时就应考虑分表&#xff0c;但实际上…

HALCON-从入门到入门-阈值分割定位算子综合运用

1.废话 之前我的一个师兄告诉我&#xff0c;针对图像上想要定位的内容&#xff0c;机器视觉中定位的方式有很多种&#xff0c;但是如果用阈值分割定位可以做的&#xff0c;就不要用模板匹配了。因为基于形状的模板匹配始终会存在匹配不到的风险&#xff0c;那如果打光效果可以…

【DevOps】Ubuntu基本使用教程

目录 引言 Ubuntu简介 安装Ubuntu 准备工作 创建启动盘 安装过程 桌面环境 基本操作 定制桌面 文件管理 文件操作 文件权限 软件管理 安装软件 更新软件 系统设置 用户账户 网络设置 电源管理 命令行操作 常用命令 管理权限 安全与维护 系统更新 备份…

C++ 12 之 指针引用

c12指针引用.cpp #include <iostream>using namespace std;struct students12 {int age; };int main() {students12 stu;students12* p &stu; // 结构体指针students12* &pp p; // 结构体指针起别名pp->age 20;// (*pp).age 22;cout << "…

编译原理期末复习

语义分析和中间代码生成 语义检查: 主要进行一致性检查和越界检查。 一致性检查: (1)表达式中操作数是否保持类型一致; (2)赋值语句的左右两边是否类型一致; (3)形、实参数类型是否一致; (4)数组元素与数组说明是否一致。…

基于PID的定速巡航控制系统设计【MATLAB/SIMULINK】

摘要&#xff1a; 本文详细介绍了定速巡航控制是一种车辆驾驶辅助系统&#xff0c;它能让驾驶者在高速或长途驾驶时&#xff0c;设定一个固定的车速&#xff0c;然后车辆会自动维持这个速度行驶&#xff0c;无需驾驶者持续踩油门。这大大减轻了驾驶者的疲劳&#xff0c;同时也…

【Ubuntu双系统】两块硬盘分别安装系统,一块硬盘安装Ubuntu 一块安装Windows

【Ubuntu双系统】两块硬盘分别安装双系统&#xff0c;一块硬盘安装Ubuntu 一块安装Windows 前言安装Ubuntu前置操作安装过程参考文献 前言 机器情况&#xff1a;两块1T的硬盘&#xff0c;其中一块已安装Windows 11现需在另一块硬盘上安装Ubuntu&#xff0c;该硬盘还未初始化Ub…

使用 PyInstaller 将 Python 代码打包成独立可执行文件

大家好&#xff0c;当你完成了一段精彩的 Python 代码&#xff0c;你可能会想要与其他人分享它。但是&#xff0c;你可能担心其他人是否拥有足够的环境来运行你的代码。或者&#xff0c;你可能希望保护你的源代码&#xff0c;以防止他人查看或修改它。在这种情况下&#xff0c;…