突破编程_C++_面试(变量与常量)
面试题 1 : C++ 中的变量存储类别有哪些,并简要描述它们的特点?
在C++中,变量的存储类别决定了变量的生命周期和可见性。以下是C++中的几种变量存储类别及其特点:
自动存储期
- 也称为局部存储类别。
- 这类变量在函数或代码块内部声明,并且在函数或代码块执行时创建,在函数或代码块退出时销毁。
- 它们的生命周期是局部的,只存在于声明它们的函数或代码块执行期间。
- 每次进入函数或代码块时,都会为这些变量分配新的存储空间,退出时释放这些空间。
静态存储期
- 这类变量在程序开始执行时就创建,并在程序结束时销毁。
- 它们可以在全局作用域、命名空间作用域或函数作用域中声明。
- 在全局或命名空间作用域中声明的静态变量在整个程序执行期间都存在。
- 在函数作用域中声明的静态变量(也称为静态局部变量)只在该函数被调用的期间存在,但其生命周期跨越了函数调用,即它们的值在函数调用之间是保持的。
线程存储期
- 这类变量在线程开始执行时创建,并在线程结束时销毁。
- 它们通常用于多线程编程,以确保每个线程都有自己的变量副本。
- 在 C++11 及以后的版本中,可以使用 thread_local 关键字来声明线程局部存储期的变量。
动态存储期
- 这类变量由 new 运算符创建,并由 delete 运算符销毁。
- 它们的生命周期由程序员控制,直到显式删除它们,否则它们会一直存在。
- 动态分配的变量在堆上分配空间,不受函数或代码块生命周期的限制。
每种存储类别都有其特定的用途和优势。例如,自动存储期的变量适用于需要临时存储数据的场景,而静态存储期的变量则适用于需要在程序执行期间持续存在的数据。线程存储期的变量则适用于多线程环境中,每个线程需要独立的数据副本时。动态存储期的变量则提供了更大的灵活性和控制力,但也需要程序员手动管理内存。
面试题 2 : const 和 constexpr 的区别是什么?它们各自在哪些场景下更有用?
在 C++ 中, const 和 constexpr 都是用于定义常量的关键字,但它们在用途和语义上存在一些区别。
const 关键字:
(1)可以用于声明一个变量为常量,这意味着一旦变量被初始化,其值就不能被修改。
(2)可以在运行时被赋值,并且可以在程序的不同部分共享相同的内存地址。
(3)可以在任何函数内部或全局作用域中定义。
(4)主要用于确保变量在程序执行期间保持不变,提高代码的可读性和可维护性。
constexpr 关键字:
(1)用于声明一个常量表达式,该表达式必须在编译时就能计算出其值。
(2)必须在编译时初始化,并且其值必须是常量表达式。
(3)该关键字在编译时被存储在程序的只读数据段中,因此它们的地址可以在程序的多个实例之间共享。
(4)主要用于编译时常量、数组大小、模板参数等需要在编译时知道值的情况。
const 和 constexpr 各自的使用场景:
const 的使用场景:
(1)当需要定义一个在程序执行期间保持不变的值时,可以使用 const 。
(2)当需要在函数内部定义一个只在该函数内部有效的常量时,可以使用 const 。
(3)当需要防止变量被意外修改时,可以使用 const 。
constexpr 的使用场景:
(1)当需要定义一个编译时常量时,可以使用 constexpr 。
(2)当需要定义一个作为数组大小的常量时,可以使用 constexpr 。
(3)当需要定义一个作为模板参数的常量时,可以使用 constexpr 。
(4)当需要优化性能,避免在运行时计算常量表达式的值时,可以使用 constexpr 。
总结来说, const 用于在运行时定义不可变的变量,而 constexpr 用于在编译时定义常量表达式。选择使用哪个关键字取决于你的具体需求,以及是否需要在编译时还是运行时确定常量的值。
面试题 3 :什么是内部链接和外部链接?如何在 C++ 中使用 static 和 extern 关键字来控制链接?
在C++中,链接( Linking )是编译器将不同的编译单元(通常是源文件)组合成一个可执行程序或库文件的过程。在这个过程中,编译器需要解决函数或变量的引用和定义之间的关联。
内部链接和外部链接是 C++ 中符号链接性的两种类型,它们决定了符号的作用域和可见性。
内部链接
当一个函数或变量被声明为 static 时,它具有内部链接。这意味着该符号只在定义它的编译单元内可见,其他编译单元无法访问它。在 C++ 中,静态成员变量和静态成员函数具有内部链接。
外部链接
默认情况下,函数或变量具有外部链接。这意味着函数或变量可以在多个编译单元之间共享,只要它在链接时是可访问的。使用 extern 关键字可以声明一个函数或变量,而不在当前编译单元中定义它,从而在其他编译单元中定义该符号。
使用 static 和 extern 关键字来控制链接:
使用 static 关键字:
在函数或变量声明前加上 static 关键字,可以使其具有内部链接。这样,该函数或变量只在其定义的编译单元内可见。
例如,在头文件中声明一个静态变量:
// header.h
static int s_val = 0;
这样, s_val 只会在包含该头文件的源文件中可见,而不会在其他源文件中共享。
使用 extern 关键字:
extern 关键字用于声明一个在其他编译单元中定义的符号。它告诉编译器该符号在链接时将被解析,而不是在当前编译单元中定义。
例如,在一个源文件中定义一个函数,并在另一个源文件中声明并使用该函数:
// file1.cpp
#include "header.h"void func()
{// ... 函数实现 ...
}// file2.cpp
#include "header.h"extern void func(); // 声明在其他编译单元中定义的函数int main() {func(); // 调用在其他编译单元中定义的函数return 0;
}
在这个例子中, func 在 file1.cpp 中定义,并在 file2.cpp 中通过 extern 关键字声明。这样, main 函数可以调用 func ,即使它没有在 file2.cpp 中定义。
注意:在 C++ 中,通常建议将变量声明为 extern ,并在一个源文件中定义它,以避免多重定义错误。对于函数,可以在头文件中声明原型,并在一个源文件中定义实现。这样,其他源文件可以通过包含该头文件来使用该函数。
面试题 4 :什么是 mutable 关键字,它有什么用处?
在 C++ 中, mutable 关键字用于在类的 const 成员函数中修改类的某个成员变量。通常, const 成员函数是不能修改它所属对象的任何成员变量的,但是,如果需要某些成员变量能够在 const 成员函数中被修改,就可以将这些成员变量声明为 mutable 。
mutable 关键字允许在 const 成员函数中修改这些成员变量,而不会影响对象的常量性。这对于某些需要在逻辑上保持常量性,但实际上需要修改内部状态的场景非常有用。
如下为样例代码:
#include <iostream>class Counter
{
public:Counter() : m_count(0), m_mutableVal(0) {}// 增加计数void increment(){m_count++;}// 在const成员函数中修改 m_mutableValvoid setMutableVal(int val) const{m_mutableVal = val;}// 获取MutableVal的值int getMutableVal() const{return m_mutableVal;}// 获取计数int getCount() const{return m_count;}private:int m_count; // 普通成员变量mutable int m_mutableVal; // mutable成员变量
};int main()
{const Counter counter; // 创建一个const对象// 调用const成员函数设置 m_mutableVal 的值counter.setMutableVal(1);printf("counter.getMutableVal() : %d\n",counter.getMutableVal());// 尝试调用非const成员函数会编译失败,因为 counter 是 const 对象// counter.increment(); // 错误:不能在const对象上调用非const成员函数return 0;
}
上面代码的输出为
counter.getMutableVal() : 1
在上面代码中, Counter 类有一个普通的成员变量 m_count 和一个被声明为 mutable 的成员变量 m_mutableVal 。在 const 成员函数 setMutableVal 中,可以修改 m_mutableVal 的值,而不会影响 m_count 的值或对象的常量性。当尝试在 const 对象 counter 上调用非 const 成员函数 increment 时,编译器会报错,因为这样做会违反 const 对象的常量性保证。
面试题 5 : volatile 关键字的作用是什么?
在 C++ 中, volatile 关键字用于告诉编译器对象的值可能会在编译器无法检测到的情况下被改变。通常有如下几种应用场景:
硬件访问
当程序直接与硬件通信时,硬件的状态可能会在任何时候改变,而这些改变不是通过 C++ 代码直接进行的。例如,一个嵌入式系统中的某个寄存器可能在外部中断或 DMA 传输完成后被更新。
多线程编程
在多线程环境中,一个线程可能会修改一个变量,而另一个线程正在读取或写入同一个变量。即使使用了互斥锁或其他同步机制, volatile 也可能被用来确保编译器不会对这个变量的访问进行优化,从而导致不正确的行为。然而,需要注意的是, volatile 本身并不提供线程间的同步或互斥;它仅仅防止编译器优化。
信号处理
在信号处理程序中,如果一个变量可能在信号处理程序之外被异步地修改,那么这个变量应该被声明为 volatile 。
编译器优化
编译器通常会对代码进行优化,假设变量的值在没有被显式修改的情况下是不会改变的。但是,如果变量可能被外部因素(如上面提到的情况)修改,那么这种优化可能是错误的。 volatile 关键字告诉编译器不要做出这样的假设。
注意: volatile 并不保证原子性。即使在 volatile 修饰的变量上执行的操作也可能不是原子的,特别是当操作涉及多个步骤(如递增一个值)时。在多线程环境中确保数据的一致性和同步通常需要使用更高级的同步原语,如互斥锁或原子操作。
此外,过度使用 volatile 可能会导致性能下降,因为编译器无法对涉及 volatile 变量的代码进行有效优化。因此,应该只在确实需要的情况下使用它。
相关文章:
突破编程_C++_面试(变量与常量)
面试题 1 : C 中的变量存储类别有哪些,并简要描述它们的特点? 在C中,变量的存储类别决定了变量的生命周期和可见性。以下是C中的几种变量存储类别及其特点: 自动存储期 也称为局部存储类别。这类变量在函数或代码块…...
k8s的一些关键信息(归类摘抄,非提炼)
零:举例说明 当用户提交一个 Deployment 对象到 Kubernetes 集群时,控制平面的 API Server 接收到该请求,并将其转发给 Controller Manager。Controller Manager 中的 Deployment Controller 监听到该请求,并根据用户定义的配置信…...

海外媒体发稿:8个提升影响力的日韩地区媒体发稿推广策略-华媒舍
在今天的数字化时代,媒体发稿推广成为企业和个人增加影响力的重要方式。特别是在日韩地区,这个拥有庞大媒体市场和活跃社交媒体用户的地区,正确的推广策略将对影响力的提升起到关键作用。我们将介绍8个提升影响力的日韩地区媒体发稿推广策略。…...
面试官:能不能给 Promise 增加取消功能和进度通知功能... 我:???
扯皮 这段时间闲着没事就去翻翻红宝书,已经看到 Promise 篇了,今天又让我翻到两个陌生的知识点。 因为 Promise 业务场景太多了自我感觉掌握的也比较透彻,之前也跟着 Promise A 的规范手写过完整的 Promise,所以这部分内容基本上…...
详解MySQL增删查改
众所周知,MySQL是非常重要的数据库语言,下面我们来回顾一下mysql的增删查改吧 MySQL创建数据库: CREATE DATABASE 数据库名;MySQL删除数据库: DROP DATABASE <database_name>; --直接删除,不检查是否存在 DROP…...

Mysql开启bin-log日志
目录 一、安装配置 二、mysqlbinlog命令 一、安装配置 yum -y install mariadb mariadb-server#安装mysql数据库#默认配置文件/etc/my.cnfvim /etc/my.cnflog-binmariadb-bin #开启二进制日志 systemctl restart mariadb#会在/car/lib/mysql/产生二进制日志文件࿰…...
Java:性能优化细节01-10
Java:性能优化细节01-10 在Java程序开发过程中,性能优化是一个重要的考虑因素。常见的误解是将性能问题归咎于Java语言本身,然而实际上,性能瓶颈更多地源于程序设计和代码实现方式的不当。因此,培养良好的编码习惯不仅…...

CVE-2022-24652 漏洞复现
CVE-2022-24652 开题 后台管理是thinkphp的,但是工具没检测出漏洞。 登陆后界面如下,上传头像功能值得引起注意 这其实就是CVE-2022-24652,危险类型文件的不加限制上传,是文件上传漏洞。漏洞路由/user/upload/upload 参考文章&a…...

LeetCode、338. 比特位计数【简单,位运算】
文章目录 前言LeetCode、338. 比特位计数【中等,位运算】题目链接与分类思路位运算移位处理前缀思想实现 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java…...

借助Aspose.BarCode条码控件,C# 中的文本转 QR 码生成器
二维码用于在较小的空间内存储大量数据。它们易于使用,可以通过智能手机或其他设备扫描来打开网站、观看视频或访问其他编码信息。在这篇博文中,我们将学习如何使用 C# 以编程方式生成基于文本的 QR 码。我们将提供分步指南和代码片段,帮助您…...

vue打包优化,webpack的8大配置方案
vue-cli 生成的项目通常集成Webpack ,在打包的时候,需要webpack来做一些事情。这里我们希望它可以压缩代码体积,提高运行效率。 文章目录 (1)代码压缩:(2)图片压缩:&…...

B端系统从0到1:有几步,其中需求分析要做啥?
一款B系统从无到有都经历了啥,而其中的需求分析又要做什么?贝格前端工场给老铁们做一下分析,文章写作不易,如果咱们有界面设计和前端开发需求,别忘了私信我呦,开始了。 一、B端系统从0到1都有哪些要走的步骤…...

django中查询优化
在Django中,查询优化是一个重要的主题,因为不正确的查询可能会导致性能问题,尤其是在处理大量数据时。以下是一些在Django中进行查询优化的建议: 一:使用select_related和prefetch_related: select_related用于优化一…...

【JavaScript】输入输出语法
目录 一、输出语法 二、输入语法 一、输出语法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…...

多模态基础--- word Embedding
1 word Embedding 原始的单词编码方式: one-hot,维度太大,不同单词之间相互独立,没有远近关系区分。 wordclass,将同一类单词编码在一起,此时丢失了类别和类别间的相关信息,比如class1和class3…...

Mysql 日志
0 引言 MySQL日志主要分为4类,使用这些日志文件,可以查看MySQL内部发生的事情。这4类日志分别是: ● 错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题。 ● 查询日志:记录建立的客户端连接和执行的…...

【开源】SpringBoot框架开发服装店库存管理系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…...

云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库
背景 基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。 Note: 由于是测试环境,以下创建了一个 local-storage 的 StorageClass ,并使用本地…...
标准IO 2月4日学习笔记
IO输入输出,操作对象是文件 Linux文件类型: b block 块设备文件 按块扫描设备信息的文件 存储设备 c character 字符设备文件 按字符扫描设备信息的文件 d direct…...
如何在1Panel上偷渡HTTP/3
本文 首发于 Anyeの小站,转载请取得作者同意。 前言 简介 HTTP/3 的基础即谷歌多年探索的基于 UDP 的 QUIC 协议。与 TCP 相比,使用 UDP 可以提供更大的灵活性,并且可以使 QUIC 完全于用户空间中实现——对协议实现的更新不像 TCP 那样需要绑…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...