C++中如何引用第三方库
C++中如何引用第三方库?动态链接库和静态链接库在 C++中通常有两种链接 library:动态链接库(Dynamic Link Library,DLL)和静态链接库(Static Link Library,LIB)
动态链接库:在程序运行时通过链接器加载动态链接库,根据程序运行需要动态的链接需要的库中的数据。在 Linux 中,动态链接库通常以 .so 为扩展名(Shared Object),通常命名方式是lib.so.。
静态链接库:在编译链接阶段,静态链接库中的代码会被复制到 bin 中,因此编译的 bin 中是包含了静态链接库的代码的。在 Linux 中静态链接库通常以 .a 为扩展名(archive),通常命名位 lib.a。
引用库在使用第三方库时通常需要两个步骤:
在调用的文件中声明包含头文件,即:#include ""
在编译时链接库文件:
1g++ main.cpp -I/path/library/include -L/path/library -lexample_lib
-I 指定引用的头文件的路径-L 指定第三方库文件所在路径-l 指定 ...
C++函数返回值为引用类型
C++中函数返回值为引用类型有什么作用?函数返回值是引用类型主要三个场景:
函数返回值是一个很大的数据结构,避免拷贝开销;
实现函数的链式赋值操作,此时函数需要作为一个左值,经典的例子有:
std::cout << "hello, world" << std::endl;实际上执行的代码逻辑是: std::cout.operator<<("hello, world").operator<<(std::endl);
operator[]:当随机访问运算符需要实现赋值功能是,函数也需要是一个左值,因此函数需要返回引用类型;
1234567891011vector<int>& addElement(vector<int>& vec, int value) { vec.push_back(value); return vec;}int main() { vector<int> numbers; ...
C++中的整数类型
题目int,long,long long在 32 位 ,64 位和 64 位下跑 32 位虚拟机的大小
一般来说在 32 位系统上:int 通常为 4 字节(32位),long 通常为 4 字节(32 位),long long 通常为 8 字节(64 位)
在 64 位系统上:int 通常位 4 字节(32 位),long 通常为 8 字节(64 位),long long通常为8 字节(64 位)
并且大小只和系统位数有关,所以在虚拟机下也就只和虚拟机的操作系统有关所以在64 位下跑 32 位虚拟机和 32 位系统是一致的。
解释通常查询 C++20 ISO 14882 可以看到在 6.8.2 有关于基本类型的描述:
有五种标准signed integer type:
signed char
short int
int
long int
Long long int
并且按这个list 的顺序每种类型都至少要有和前面的类型一样多的空间。
另外还有一些 impl 定义的扩展 signed integer type,与标准 signed integer type 统称为 signed ...
广告系统的一些基本概念
Refhttps://www.zhihu.com/tardis/zm/art/67578681?source_id=1003
Mac新机开荒
通用开发环境配置
iTerm2
https://iterm2.com/ 下载
安装HomeBrew
1/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
此过程会安装Xcode,git也会被安装好。
安装oh-my-zsh
1sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
安装p10k
1git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
在~/.zshrc配置使用主题:ZSH_THEME="powerlevel10k/powerle ...
装机
装机是时候升级一下设备了,完成一直以来的一个梦想。目标是无卡神机,除了显卡也算是性能拉满了。
清单:
CPU:i7-13700K
K 版本 CPU 是不附赠散热器的,需要另行购买
主板:技嘉Z790M Aorus Elite AX D5 – ¥3738
买的板 U 套装,比较实惠
电源:Sea Sonic Focus GX 750W – ¥699
海韵电源应该是 TOP 1了,应该非常稳定,价格较贵
机箱:先马小朱雀 – ¥89
纯黑风格,无光污染
内存:金百达黑刃 DDR5 6800 16G×2 – ¥669
性价比之选,性能也非常高
存储:致态TiPro7000 1TB – ¥539
这个倒是没什么调研,记得几年前买的海康 C2000Pro 256GB 版本挺贵的,感觉现在价格都便宜了不少,听说长江存储国产存储非常便宜,性价比之选。
散热器:利民AX120 V2 PLUS – ¥129
装上 CPU、内存、存储
放进机箱主板位置比对一下,果然有两个铜柱没上。
不同类型主板铜柱位置参考
待续
主要参考:
【装机教程】全网最好的装机教程,没有之一 – ...
enable_shared_from_this
Question:有一个类,这个类的对象是使用shared_ptr 管理的,在类内某个成员函数里,我们需要获取指向当前对象的 shared_ptr,应该如何获取?
可能的答案 1:
123456class A {public: std::shared_ptr<A> get_ptr() { return std::shared_ptr<A>(this); // 返回 this 指针的 shared_ptr }};
但是这样做是不安全的。在 get_ptr 中,会根据 this 指针创建一个完全独立的新的std::shared_ptr,这个 shared_ptr 有自己的引用计数,完全独立于当前类对象的 shared_ptr;这时这两个 shared_ptr 是同时在管理这个对象,如果新的这个shared_ptr 计数清零,它会尝试删除这个对象,造成未定义的行为。
正确的做法就是使用std::enable_shared_from_this
std::enable_shared_from_this是一个模板类,可以 ...
与copilot的对话1
wanghao-d: typeid(j).name()是什么
GitHub Copilot: typeid(j).name()是C++中的一个运算符,它返回一个指向类型信息的字符串的指针。在这个例子中,它返回变量j的类型的名称。
wanghao-d: 那 m 是什么
GitHub Copilot: 我不确定你指的是哪个m,因为上下文不清楚。在C++中,m可以是变量名、函数名或类成员变量名。请提供更多上下文或代码以便我能够更好地回答你的问题。
wanghao-d: 我输出typeid(j).name()的值是 m
GitHub Copilot: 根据你提供的代码,typeid(j).name()返回的字符串的第一个字符是m。这是因为j的类型是std::vector<std::vector<int>>,而m是这个类型名称的第一个字符。请注意,typeid返回的字符串的格式和内容是由编译器实现定义的,因此可能会因编译器而异。
wanghao-d: size_t是什么类型
GitHub Copilot: size_t是C++中的一种无符号整数类型,通常用于表示内存大小或 ...
智能指针
std::unique_ptrstd::unique_ptr是一个独占所有权的指针,同一时间只能有一个std::unique_ptr 指向给定对象,当std::unique_ptr被销毁时,它指向的对象也会被释放;
动手试一下
12345678910111213141516#include<iostream>#include<memory>struct A { std::unique_ptr<int> u_ptr; A() { std::cout << "construct A" << std::endl; } ~A() { std::cout << "destruct A" << std::endl; }};int main() { std::unique_ptr<A> u_ptr(new A()); return 0;}
std::share ...
强制类型转换
C++有四种强制类型转换运算符:
static_cast: 可用于基本类型的转换,或者将指针转换为其他基本类型的指针,如:
12int i = 10;double d = static_cast<double>(i);
dynamic_cast: 用于基类和派生类之间的转换,包含了类型检查,只有在确定安全的情况下才会进行转换,否则就会 return nullptr;dynamic_cast 只能用于含有虚函数的类,且只能用于指针或引用。
const_cast: 用于修改类型的 const 和volatile 修饰词,对于 const 变量,可使用 const_cast 去除 const属性,然后才能改变变量的值;
123const int i = 10;int* p = const_cast<int*>(i);*p = 20;
reinterpret_cast: 是一种底层的强制类型转换,可以将任意类型的指针转换为任何其他类型的指针,reinterpret 会对变量进行机器(位)级别的重新解释,不进行任何类型检查和转换,属于非常危险的操作。



