#C++基础
文章平均质量分 95
以C++的基础知识为主,如语法等等
流星雨爱编程
记录工作的日常,心得体会
展开
-
为什么变量不可以在 switch 语句中声明定义?
变量不能在switch语句中声明定义的主要原因是作用域和跳转语句的限制。为了避免潜在的作用域冲突和未定义行为,我们应该在switch语句之前声明所有必要的变量,或者使用花括号在case分支中创建新的作用域(在支持C99或更高标准的编译器中)。通过遵循这些最佳实践,我们可以确保代码的清晰性和稳定性。原创 2024-06-26 08:18:34 · 698 阅读 · 15 评论 -
C++ 如何高效的使用 STL 容器?
在使用C++标准模板库(STL)中的容器时,对象复制的常见情况和复制的实现方式是重要的考虑因素。对象的复制通常通过复制构造函数和复制赋值运算符来完成,这两个函数是类的成员函数,用于创建类的新对象或将一个对象的值赋给另一个对象。然而,对象的复制可能会导致性能问题,特别是当对象的复制成本很高时。此外,如果有一个对象,其中“复制”有一个非常规的含义,那么将这样的对象放入容器可能会导致问题。在存在继承的情况下,复制可能会导致切片问题。原创 2024-04-27 23:23:59 · 1178 阅读 · 8 评论 -
#ifndef vs #pragma once, 哪个更好用?
在C++编程中,头文件守卫(Header Guard)是一种防止头文件内容在同一编译单元中被多次包含的技术。这种重复包含可能导致编译错误,如类型重定义或变量多重声明。为了解决这个问题,开发者通常使用预处理指令来确保头文件只被包含一次。最常见的两种方法是使用#ifndef#define#endif宏(也称为传统的头文件守卫)和指令。原创 2024-04-18 21:42:49 · 830 阅读 · 1 评论 -
C++之std::initializer_list详解
类的构造函数可以接受 std::initializer_list 参数,以便在创建对象时使用初始化列表进行初始化。public:private:从上面可以看到,使用std::initializer_list的优点:1)灵活性和扩展性:std::initializer_list可以用在任何需要可变数量参数的函数中,提供了高度的灵活性和扩展性。例如,你可以写一个接受std::initializer_list 参数的函数,让它可以接受任意数量的元素进行初始化。2)原创 2024-04-09 22:39:46 · 1463 阅读 · 1 评论 -
原生数组和std::array异同
std::array的优点:固定大小:std::array的大小在编译时确定,这有助于避免运行时的大小检查和可能的性能开销。更好的类型安全:与原生数组相比,std::array提供了更好的类型安全,因为它是一个类模板,而不是简单的数组类型。支持STL算法:由于std::array提供了迭代器接口,因此可以很方便地与STL算法一起使用。成员函数和接口:std::array提供了一系列有用的成员函数,如size(), empty(), begin(), end()等,这些功能在原生数组上是没有的。原创 2024-04-08 23:14:46 · 1112 阅读 · 9 评论 -
C/C++中decltype关键字用法总结
decltype可以作用于变量、表达式及函数名。①作用于变量直接得到变量的类型;②作用于表达式,结果是左值的表达式得到类型的引用,结果是右值的表达式得到类型;③作用于函数名会得到函数类型,不会自动转换成指针。总的来说,decltype在C++中是一个非常强大的工具,它允许开发者以更简洁和灵活的方式处理复杂的类型问题。原创 2024-04-06 10:24:20 · 1125 阅读 · 5 评论 -
C/C++中const关键字用法总结
使用const还有很多好处:1) 类型安全:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。2) 可以节省空间,避免不必要的内存分配: const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象宏一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而宏定义的常量在内存中有若干个拷贝。原创 2024-04-05 18:58:59 · 957 阅读 · 1 评论 -
C/C++中static关键字用法总结
在使用关键字static的时候,我们需要注意一下几个原则:被static修饰的变量的存储位置都在静态区,且生命周期延长至整个程序运行结束。static具有隔离作用,被static修饰的全局变量和全局函数的作用域由全局变为当前文件。静态变量虽然具有全局变量的生命周期,但只能作用于自己的作用域。普通静态成员需要在类的外面进行初始化。静态成员函数不能调用类的非静态成员,包括非静态成员和非静态成员函数。原创 2024-04-04 22:37:55 · 1063 阅读 · 7 评论 -
预处理 #pragma 命令详解
总的来说,#pragma是一个强大的工具,但应该谨慎使用,确保它不会导致代码在不同编译器或平台上的不可移植性。原创 2024-03-19 21:57:02 · 1368 阅读 · 0 评论 -
C/C++中{}的用法总结(全)
{} 可以用于定义枚举类型,其中包含一组可能的值。Opt1,Opt2,Opt3//C++11之后版本可以加class,限制枚举的作用域,如:Opt1,Opt2,Opt3{} 可以用于定义Lambda函数。Lambda函数是一种匿名的函数对象,可以在函数中传递。在 C++ 中,我们建议尽可能使用列表初始化(即大括号 {})。这种初始化方式可以提供更一致的语法,防止窄化转换,避免 “最令人困惑的语法” 问题,还可以用于初始化任何类型的对象,包括基本类型、数组、结构体,以及类的成员变量。原创 2024-03-14 12:54:01 · 2180 阅读 · 30 评论 -
从汇编来角度剖析C语言函数调用过程
当一个c函数被调用时,一个栈帧(stack frame)是如何被建立,又如何被消除的。这些细节跟操作系统平台及编译器的实现有关,下面的描述是针对运行在Intel奔腾芯片上Linux的gcc编译器而言。c语言的标准并没有描述实现的方式,所以,不同的编译器,处理器,操作系统都可能有自己的建立栈帧的方式。原创 2024-03-13 22:54:35 · 829 阅读 · 9 评论 -
C++17之折叠表达式
折叠表达式是一个强大的工具,但也需要谨慎使用。它可以使代码更简洁、更易于阅读,但也可能会使代码更难以理解。在使用折表达式之前,确保你理解了它的工作原理,并考虑是否有其他更直观的方法可以达到相同的效果。原创 2024-02-26 21:51:23 · 1163 阅读 · 8 评论 -
有了NULL,为什么C++还需要nullptr?
综上所述,尽管C++已经有了NULL来表示空指针,但引入nullptr提供了更高的类型安全性、避免了函数重载时的歧义,并增加了代码的清晰性和可读性。因此,在现代C++编程中,推荐使用nullptr来代替NULL表示空指针。原创 2024-02-17 08:53:54 · 1353 阅读 · 24 评论 -
C++ new 和 malloc 的区别?
new/delete提供了更符合 C++ 面向对象特性的内存管理方式。它们处理类型安全、对象生命周期(构造和析构)、异常安全以及简化语法。然而,这些改进也带来了一定的性能开销,这在某些性能敏感的应用中可能是一个考虑因素。在 C++ 中,new/delete是推荐的方式,因为它们提供了更安全和便利的内存管理机制。C++内存分配策略-CSDN博客。原创 2024-02-15 10:53:07 · 1535 阅读 · 15 评论 -
浮点数详解
浮点数编码转换采用的是IEEE 规定的编码标准,float 和 double 这两种类型数据的转换原理相同,但由于表示的范围不一样,编码方式有些许区别。IEEE规定的浮点数编码会将一个浮点数转换为二进制数。以科学记数法划分,将浮点数拆分为3部分:符号、指数、尾数。原创 2024-01-23 07:28:14 · 1494 阅读 · 13 评论 -
深入理解STL空间分配器(四):bitmap_allocator
bitmap_allocator申请内存,是先从上一次分配block的超级块中,往后查找未使用的block分配,若超级块中block都已分配,则从_S_mem_blocks容器内往后查找下一个超级块。如果_S_mem_blocks容器内没有超级块了,则从内存池free_list中申请超级块,并将其缓存到S_mem_blocks容器内,以待后续分配使用。_S_mem_blocks容器内的超级块没有按大小升序排列,而内存池free_list中的超级块是按大小升序排列的。转载 2024-01-09 22:59:20 · 140 阅读 · 0 评论 -
深入理解STL空间分配器(三):pool_allocator
pool_allocator是一种基于单锁内存池的空间分配器,其内部采用内存池思想,通过构建16个空闲内存块队列,来进行内存的申请和回收处理。每个空闲队列管理的内存块大小固定,且均为8的倍数,范围从8到128字节,按8的倍数递增。该空间分配器最小分配单位为8字节,低于128字节(含128)的内存块申请,采用内存池分配策略,高于128字节的内存块申请,直接从操作系统new申请。转载 2024-01-09 22:46:24 · 168 阅读 · 0 评论 -
深入理解STL空间分配器(二):mt_allocator
templatepublic:// 用来构建_Thread_record链表,指向下一个_Thread_record节点,最后一个节点的_M_next指向null.// 该线程分配到的ID,从1到_S_max_threads.// 用来构建_Block_record链表,将内存块串联成链表形式// 请求该内存块的线程的ID// 指针数组,数组中的每个指针指向第一个空闲块节点,数组的大小等于线程的个数+1,每个线程占一个数组元素,0号表全局空闲链表// 内存块地址。转载 2024-01-09 22:39:25 · 110 阅读 · 0 评论 -
深入理解STL空间分配器(一): new_allocator
_new_allocator:C++标准中定义的分配器,仅对operator new和operator delete做简单封装;malloc_allocator:C++标准中定义的分配器,仅对std::malloc和std::free做简单封装;__mt_alloc:一种支持多线程的空间配置器(亦可单线程),可分配2的幂次方大小的内存块,该配置器可灵活调整,性能高(stl手册描述,个人未实测);bitmap_allocator:一种使用位图来区分内存是否分配的配置器;转载 2024-01-09 22:16:00 · 406 阅读 · 1 评论 -
C++内存分配策略
2.在栈上创建:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限,如数组,局部变量,形参。3.全局区(静态区、static): 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。一个可执行程序,在不运行时占用磁盘空间的是全局区、文字常量区和程序代码区,运行后栈区和堆区在内存里面才划分出来工作。原创 2024-01-08 22:29:08 · 1233 阅读 · 2 评论 -
深入理解可变参数(va_list、std::initializer_list和可变参数模版)
std::initializer_list 类型对象是一个访问 const T 类型对象数组的轻量代理对象。std::initializer_list 对象在这些时候自动构造:1)用花括号初始化器列表列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list 参数,如std::vector的构造函数 vector(initializer_list _Ilist, const _Alloc& _Al = _Alloc())原创 2024-01-04 11:49:29 · 2562 阅读 · 0 评论 -
C/C++框架和库推荐
包括了STL容器,算法和函数等。:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。:标准模板库: POSIX系统的C标准库规范e :C++标准委员会。原创 2024-01-03 15:19:22 · 1285 阅读 · 1 评论 -
C++之数据转换(全)
截止C++20标准模板库同时提供了高级数值转换函数和低级数值转换函数,下面就仔细讲解一下这些数值转换函数的用法。原创 2023-12-23 12:44:40 · 1879 阅读 · 2 评论 -
C++高质量编程
这个是林锐博士整理出来的C++高质量编程指南,我写了十多年的代码,早期也是以这些经典资料为范本,经常阅读,对我的成长有很大的帮助。现在把它整理出来,希望对看到这边博客的人有所帮助。转载 2023-12-28 19:59:57 · 242 阅读 · 2 评论