当前位置: 首页 > news >正文

双公示网站专栏建设/一键优化下载安装

双公示网站专栏建设,一键优化下载安装,网络开发公司是干什么的,网站要怎么做才能让360收录1 单独编译 C允许将组件函数放在独立的文件即头文件中,头文件中可以包含以下内容: 函数原型;使用#define或const定义的符号常量;结构声明;类声明;模板声明;内联函数。 注意,在包含…

1 单独编译

C++允许将组件函数放在独立的文件即头文件中,头文件中可以包含以下内容:

  • 函数原型;
  • 使用#define或const定义的符号常量;
  • 结构声明;
  • 类声明;
  • 模板声明;
  • 内联函数。

注意,在包含自定义的头文件时应使用 #include “test.h”,这样编译器才会优先从当前工作目录或其他目录查找;如果是#include <test.h>形式,则编译器将在存储标准头文件的主机系统的文件系统中查找。

在同一个文件中只能将同一个文件包含一次。但是在实际开发时很可能会使用包含了另一个头文件的头文件,从而造成头文件被重复包含的问题,因此一般都需要在头文件的头尾加上预处理器编译指令#ifndef,意味着仅当之前未使用预处理器编译指令#define定义名称CODE_TEST_H时,才处理#ifndef和#endif之间的语句。

#ifndef CODE_TEST_H
#define CODE_TEST_H
// ...
// 头文件具体内容
// ...
#endif

2 存储持续性

根据数据在内存中保留时间的不同,可以将存储数据方案分为:

  • 自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或代码块时被创建,在执行完成后它们使用的内存被释放。
  • 静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性为静态的。它们在程序的整个运行过程中都存在。
  • 动态存储持续性:用new操作符分配的内存将一直存在,直到使用delete操作符将其释放或程序结束为止。

2.1 自动变量

可以使用关键字auto来显式地指出存储类别,由于局部变量默认状态下就是自动的,因此程序员几乎不使用它。

auto int num;

2.2 寄存器变量

可以使用关键字register来声明局部变量,表示该变量使用频率很高,寄存器变量会提醒编译器,用户希望它通过使用CPU寄存器来处理特定变量,从而提供对变量的快速访问(理念是CPU访问寄存器中的值的速度比访问堆栈中内存快)。

注意,编译器不一定会用寄存器来存储register变量,因为寄存器可能已经全被占用,或者寄存器无法存储所请求的类型。

如果变量被存储在寄存器中,则没有内存地址,因此不能将地址操作符用于寄存器变量。

int num1;
register int num2;
cout << &num1 << endl; // ok
cout << &num2 << endl; // not allowed

2.3 静态持续变量

C++为静态存储持性变量提供了3种链接性:外部链接性、内部链接性和无链接性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IWhEwhSN-1677946789635)(C:\Users\LYJ\AppData\Roaming\Typora\typora-user-images\image-20230304220011282.png)]

所有的静态持续变量都有下面的两个初始化特征:

  • 未被初始化的静态变量的所有位都被设置为0。
  • 只能使用常量表达式来初始化静态变量。
#include <iostream>using namespace std;int global = 1; // 外部链接性,可在其他文件使用static int one_file = 2; // 内部链接性,被限定在当前文件内使用void test()
{static int count = 0; // 无链接性,仅在函数定义内使用
}int main()
{return 0;
}

C++支持使用关键字 extern 来重新声明以前定义过的外部变量,以及使用作用域解析操作符(::)来访问被隐藏的外部变量。

#include <iostream>using namespace std;int global = 1; // 外部全局变量void test1()
{extern int global; // 引用声明,重新声明在外部已定义的变量cout << global << endl; // 输出:1
}void test2()
{int global = 2; // 定义声明,定义与全局变量同名的局部变量后,局部变量将隐藏全局变量cout << global << endl; // 输出:2cout << ::global << endl; // 输出:1 // 表示使用变量的全局版本
}int main()
{test1();test2();return 0;
}

2.4 说明符和限定符

存储说明符包括auto、register、static、extern、mutable,cv-限定符包括const、volatile。

2.4.1 volatile

volatile 关键字表明,即使程序代码没有对内存单元进行修改,其值也可能发生变化。例如,在两个程序共享数据场景下,当A程序在第一次访问结束后,B程序可能会在这之后修改数据值,后面A程序再一次访问时就是新数据值了。

该关键字的作用是为了改善编译器的优化能力,因为编译器在发现程序在几条语句中两次使用了某个变量的值时,编译器为了能让查找效率更高,可能会将该变量值缓存到寄存器中,而不是让程序查找这个值两次,这种优化假设变量的值在这两次使用之间不会变化。将变量声明为volatile,相当于告诉编译器,不要进行这种优化。

2.4.2 mutable

mutable 是用来修饰一个 const 结构(或类)实例的部分可变的数据成员的。

#include <iostream>using namespace std;struct ST {char name[20];mutable int num;
};int main()
{const ST st = { "Tom", 1 };st.num++; // okst.name = "Job"; // not allowedreturn 0;
}

2.4.3 const

在C++中,在默认情况下全局变量的链接性为外部的,但const全局变量的链接性为内部的。

const int num = 1; // same as static const int num = 1;

C++修改了常量类型的规则是为了能让程序员更便于使用。例如,假设将一组常量放在头文件中,并在同一个程序的多个文件中使用该头文件,那么所有的源文件都将包含该定义。

  • 如果const声明的链接性像常规变量那样是外部的,这将出错,因为不能在多个文件中定义同一个全局变量。也就是说,其他引用文件必须都要使用extern关键字来提供引用声明。
  • 如果const声明是内部的,那每个源文件都有自己的一组常量,而不是所有文件共享一组常量。

如果出于某种原因,程序员希望某个常量的链接性为外部的,则可以使用关键字extern来覆盖默认的内部链接性。

extern const int num = 1;

2.5 语言链接性

在C++中,由于同一个名称可能会对应多个函数,因此,C++编译器执行名称矫正或名称修饰,为重载函数生成不同的符号。例如,可能将spiff(int)转换为_spiff_i,而将spiff(double)转换为_spiff_d,这种方法被称为C++语言链接。

如果要在C++程序中使用C库中预编译的函数,由于spiff(int)在C库文件中符号为spiff_,而C++查找约定是查找符号名称_spiff_i,此时需要使用函数原型来指出要使用的约定:

extern "C" void spiff(int); // C
extern void spiff(int); // C++
extern "C++" void spiff(int); // C++

3 布局new操作符

布局new操作符能够在使用new申请内存时指定要使用的内存位置。

与常规new操作符的区别在于,布局new操作符使用传递给它的地址,它不跟踪哪些内存单元已被使用,也不查找未使用的内存块,因此这要求程序员自己去管理内存。

#include <iostream>
#include <new>using namespace std;const int N = 3;
char buffer[512];int main()
{double *pd1, *pd2;pd1 = new double[N];pd2 = new (buffer) double[N];for (int i = 0; i < N; i++) {pd1[i] = pd2[i] = i * 0.2 + 1000;}cout << "Memory address: \n" << "heap: " << pd1 << ", buffer: " << (void*)buffer << endl;for (int i = 0; i < N; i++) {cout << "pid1[" << i << "] in address " << &pd1[i] << ", ";cout << "pid2[" << i << "] in address " << &pd2[i] << endl;}return 0;
}

输出:

Memory address: 
heap: 0x7a1760, buffer: 0x407040
pid1[0] in address 0x7a1760, pid2[0] in address 0x407040
pid1[1] in address 0x7a1768, pid2[1] in address 0x407048
pid1[2] in address 0x7a1770, pid2[2] in address 0x407050

4 名称空间

C++中可以通过关键字namespace定义一种新的声明区域来创建命名的名称空间。

  • 任何名称空间中的名称都不会与其他名称空间中的名称发生冲突。
  • 可以通过作用域解析操作符::,使用名称空间来限定该名称。

4.1 using声明和using编译指令

using声明使指定的标识符可用,using编译命令使整个名称空间可用。

namespace Test1 {int num = 1;
}namespace Test2 {int num = 2;
}using Test1::num; // using声明
using namespace Test2; // using编译命令

另外,可以给名称空间创建别名,以简化对嵌套名称空间的使用。

namespace Out {namespace Inner {int num = 1;}
}namespace OI = Out::Inner;

4.2 未命名的名称空间

可以通过省略名称空间的名称来创建未命名的名称空间。

由于这种名称空间没有名称,因此不能在匿名空间所属文件外的其他文件中使用该名称空间中的名称,因此这种方法可以替代链接性为内部的静态变量。

static int count; // 内部静态变量namespace {int count; // 应替代为匿名空间形式
}

相关文章:

C++ Primer Plus 学习笔记(四)—— 内存模型和名称空间

1 单独编译 C允许将组件函数放在独立的文件即头文件中&#xff0c;头文件中可以包含以下内容&#xff1a; 函数原型&#xff1b;使用#define或const定义的符号常量&#xff1b;结构声明&#xff1b;类声明&#xff1b;模板声明&#xff1b;内联函数。 注意&#xff0c;在包含…...

详解基于 Celestia、Eclipse 构建的首个Layer3 链 Nautilus Chain

以流支付为主要概念的Zebec生态&#xff0c;正在推动流支付这种新兴的支付方式向更远的方向发展&#xff0c;该生态最初以Zebec Protocol的形态发展&#xff0c;并从初期的Solana进一步拓展至BNB Chian以及Near上。与此同时&#xff0c;Zebec生态也在积极的寻求从协议形态向公链…...

列表与数组的转化

目录用np.array(a)将列表转换为数组列表转数组的特殊情况(一)列表转数组的特殊情况(二)针对子元素个数不一致的解决办法用a.tolist()函数将数组转化为列表在python的学习中&#xff0c;经常会用到数组与列表的相互转化&#xff0c;本文主要介绍下关于数组与列表转化的问题。用n…...

docker 运行花生壳实现内外网穿透

环境&#xff1a;centos 7 ,64位 1、创建一个指定的文件夹作为安装示例所用&#xff0c;该示例文件夹为“hsk-nwct”。“hsk-nwct”内创建“app”文件夹作为docker容器挂载出来的文件。 2、在“app”内下载花生壳linux安装包&#xff0c;下载花生壳应用&#xff1a;花生壳客户…...

操作系统——16.时间片轮转、优先级、多级反馈队列算法

这篇文章我们来看一下进程调度算法中的时间片轮转、优先级、多级反馈队列算法 目录 1.概述 2.时间片轮转调度算法&#xff08;RR&#xff0c;Round-Robin&#xff09; 3.优先级调度算法 4.多级反馈队列调度算法 5.分析对比 1.概述 首先&#xff0c;我们来看一下这篇文章…...

Python3.8.8-Django3.2-Redis-连接池-数据类型-字符串-list-hashmap-命令行操作

文章目录1.认识Redis1.1.优点1.2.缺点2.在Django中Redis的连接3.Redis的基础用法3.1.hashmap结构3.2.list结构4.命令行查看数据库5.作者答疑1.认识Redis Remote DIctionary Server(Redis) 是一个key-value 存储系统&#xff0c;是跨平台的非关系型数据库。是一个开源的使用 AN…...

Android kotlin 系列讲解(进阶篇)高级项目架构模式 - MVVM

<<返回总目录 1、MVVM是什么 MVVM是Model-View-ViewModel的缩写&#xff0c;是一种高级项目架构模式。 MVVM架构可以将程序结构主要分成三个部分&#xff1a; Model&#xff1a;数据模型部分&#xff0c;包括从服务端获取的json数据或者从本地获取的数据等等View&…...

8. 查找

1 题目描述 查找成绩10开启时间2021年09月24日 星期五 18:00折扣0.8折扣时间2021年11月15日 星期一 00:00允许迟交否关闭时间2021年11月23日 星期二 00:00 输入 n(n ≤ 10^6)个不超过 10^9的单调不减的&#xff08;就是后面的数字不小于前面的数字&#xff09;非负整数 &#…...

二分查找算法

感谢“五点七边”工作室的算法讲解&#xff0c;详细内容可以参考视频讲解 二分查找为什么总是写错&#xff1f;_哔哩哔哩_bilibili 此处仅是个人学习总结 以target等于5为例&#xff0c;输入: 1 2 3 5 5 5 8 9 1. 找到第一个 > target 的元素 判断条件 < target&am…...

Git(3)之远程服务器

Git基础之远程服务器 Author&#xff1a;onceday date&#xff1a;2023年3月5日 满满长路有人对你微笑过嘛… windows安装可参考文章&#xff1a;git简易配置_onceday_CSDN博客 參考文档&#xff1a; 《progit2.pdf》&#xff0c;Progit2 Github。《git-book.pdf》 文章目…...

Javalin解构

Javalin Javalin是一个轻量级http框架&#xff0c;我们可以很容易的了解请求的处理过程及其设计&#xff0c;具有较高的学习意义。 从demo说起 public static void main(String[] args) {Javalin app Javalin.create(config -> {System.out.println("用户配置"…...

yolov5算法,训练模型,模型检测

嘟嘟嘟嘟&#xff01;工作需要&#xff0c;所以学习了下yolov5算法。是干什么的呢&#xff1f; 通俗来说&#xff0c;可以将它看做是一个小孩儿&#xff0c;通过成年人&#xff08;开发人员&#xff09;提供的大量图片的学习&#xff0c;让自己知道我看到的哪些场景需要提醒给成…...

linux系统防火墙开放端口

linux系统防火墙开放端口 在外部访问CentOS中部署应用时&#xff0c;需要通过防火墙管理软件,开端口,或者直接关闭防火墙进行解决(不建议) 加粗样式 常用命令&#xff1a; systemctl start firewalld #启动 systemctl stop firewalld #停止 systemctl status firewalld #查看…...

CSAPP第九章 虚拟内存

理解虚拟内存的原因 本章前部分描述虚拟内存是如何工作的&#xff0c;后一部分描述应用程序如何使用和管理虚拟内存 物理和虚拟寻址 虚拟内存作为缓存的工具 页表 页命中 缺页 虚拟内存作为内存管理的工具 简化链接&#xff0c;简化加载&#xff0c;简化共享&#xff0c;简化…...

numpy数组与矩阵运算(二)

文章目录矩阵生成与常用操作矩阵生成矩阵转置查看矩阵特性矩阵乘法计算相关系数矩阵计算方差、协方差、标准差计算特征值与特征向量计算逆矩阵求解线性方程组奇异值分解函数向量化矩阵生成与常用操作 矩阵生成 扩展库numpy中提供的matrix()函数可以用来把列表、元组、range对…...

Dubbo 中 Zookeeper 注册中心原理分析

Dubbo 中 Zookeeper 注册中心原理分析 文章目录Dubbo 中 Zookeeper 注册中心原理分析一、ZooKeeper注册中心1.1 ZooKeeper数据结构1.2 ZooKeeper的Watcher机制1.3 ZooKeeper会话机制1.4 使用ZooKeeper作为注册中心二、源码分析2.1 AbstractRegistry2.2 FailbackRegistry2.2.1 核…...

素数产生新的算法(由筛法减法改为增加法)--哥德巴赫猜想的第一次实际应用

素数产生新的算法&#xff08;由筛法减法改为增加法&#xff09;--哥德巴赫猜想的第一次实际应用 摘要&#xff1a;长期以来&#xff0c;人们认为哥德巴赫猜想没有什么实际应用的。 现在&#xff0c;我假设这个不是猜想&#xff0c;而是定理或公理&#xff0c;就产生了新的应用…...

递归-需要满足三个条件

一&#xff0c;概述 递归是一种应用非常广泛的算法&#xff08;或者编程技巧&#xff09;。很多数据结构和算法的编码实现都要用到递归&#xff0c;比如 DFS 深度优先搜索、前中后序二叉树遍历等。 去的过程叫“递”&#xff0c;回来的过程叫“归”。基本上所有的递归问题都可…...

【剑指Offer-Java】两个栈实现队列

题目 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 输入&#xff1a; [“CQueue”,“appendT…...

Allegro如何将Waived掉的DRC显示或隐藏操作指导

Allegro如何将Waived掉的DRC显示或隐藏操作指导 在用Allegro做PCB设计的时候,如果遇到正常的DRC,可以用Waive的命令将DRC不显示,如下图 当DRC被Waive掉的时候,如何将DRC再次显示出来。类似下图效果 具体操作如下 点击Display...

MATLAB——数据及其运算

MATLAB数值数据数值数据类型的分类1&#xff0e;整型整型数据是不带小数的数&#xff0c;有带符号整数和无符号整数之分。表中列出了各种整型数据的取值范围和对应的转换函数。2&#xff0e;浮点型浮点型数据有单精度(single&#xff09;和双精度&#xff08;(double)之分&…...

【微信小程序】-- 页面导航 -- 声明式导航(二十二)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

gdb查看汇编代码的例子

gdb查看汇编代码的例子 操作步骤 用 gdb 启动可执行文件&#xff1a;gdb executable_file在 gdb 中设置断点&#xff1a;break function_name 或者 break *memory_address运行程序&#xff1a;run当程序停止在断点处时&#xff0c;使用 disassemble 命令来查看汇编代码&#…...

第四讲:如何将本地代码与服务器代码保持实时同步

一、前言 在我们进行 Ambari 二次开发时,通常会先在服务器上部署一套可以使用的 Ambari 环境。 二次开发,就肯定是要改动代码的,我们不能老是在服务器上用vim编辑文件,那样效率太低,始终不是长久之计。 所以我们需要在本地打开我们的Ambari源码项目,比如用idea工具,可…...

cuda调试(一)vs2019-windows-Nsight system--nvtx使用,添加nvToolsExt.h文件

cuda调试 由于在编程过程中发现不同的网格块的结构&#xff0c;对最后的代码结果有影响&#xff0c;所以想记录一下解决办法。 CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid cuda context (上下文) context类似于CPU进程上下&#xff0c;表示由管理层 Drive …...

向Spring容器中注入bean有哪几种方式?

文章前言&#xff1a; 写这篇文章的时候&#xff0c;我正在手机上看腾讯课堂的公开课&#xff0c;有讲到 Spring IOC 创建bean有哪几种方式&#xff0c;视频中有提到过 set注入、构造器注入、注解方式注入等等&#xff1b;于是&#xff0c;就想到了写一篇《Spring注入bean有几种…...

如何用 Python采集 <豆某yin片>并作词云图分析 ?

嗨害大家好鸭&#xff01;我是小熊猫~ 总有那么一句银幕台词能打动人心 总有那么一幕名导名作念念不忘 不知道大家有多久没有放松一下了呢&#xff1f; 本次就来给大家采集一下某瓣电影并做词云分析 康康哪一部才是大家心中的经典呢&#xff1f; 最近又有哪一部可能会成为…...

Python装饰器的具体实用示例

示例1&#xff1a;普通装饰器 def name(n):def func(x):res n(xx)return resreturn funcname def run(x): # run name(run)print(x)if __name__ __main__:run(1) # 2def name(n):def func(*x):res n(xx)return resreturn funcname def run(x): # run name(run)pr…...

谈谈我对Retrofit源码的理解

文章目录一、Retrofit简介二、使用介绍2.1 app / build.gradle添加依赖2.2 创建 Retrofit 实例2.3 创建 API 接口定义文件2.4 使用 Retrofit 进行网络请求三、源码分析3.1 创建 Retrofit 实例: 建造者模式创建Retrofit3.2 实例化API接口: 动态代理模式3.3 获取Observable返回值…...

八股文(三)

目录 一、 如何理解原型与原型链 二、 js继承 三、 vuex的使用 1.mutation和action的区别 mutation action 2.Vuex都有哪些API 四、 前端性能优化方法 五、 类型判断 题目 &#xff08;1&#xff09;typeof判断哪个类型会出错&#xff08;即结果不准确&#xff09;&…...