首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

漫谈 C++ 各种检查

C++调用一个函数、使用一个类、实例化一个模板,对传入参数、使用时机,往往会有很多 限制 (constraint/restriction)(例如,数值参数不能传入负数、对象访问不是线程安全...漫谈 C++ 各种检查 1 编译检查 编译静态检查,主要依靠 C++ 语言提供 语法支持/静态断言 和 编译器扩展 实现 —— 检查失败情况下,编译失败。...1.2 拷贝性检查 C++ 语言本身有很多编译检查(例如 类成员访问控制 (member access control)、const 关键字 在编译成汇编语言,不能反编译还原),但 C++ 对象默认拷贝...&,区分在对象处于 非 const / 其他状态 Run 成员函数,只允许一次回调 base::OnceCallback 非 const 状态下调用 Run 函数,保证严谨 资源管理语义...lock> 列表(TLS 存储;获取记录,释放移除) 创建断言 predecessor 已创建(如果 predecessor 不存在,可能顺序错误) 获取断言 predecessor 当前线程最近获取

2.3K20

C++11新特性学习笔记

静态断言好处: 更早报告错误,我们知道构建早于运行,更早错误报告意味着开发成本降低 减少运行时开销,静态断言编译期检测,减少了运行时开销 语法如下: static_assert(常量表达式...使用constexpr,你可以创建一个编译函数: constexpr函数限制: 函数中只能有一个return语句(有极少特例) 函数必须返回(不能void函数) 使用前必须已有定义 return...std::function C++中,可调用实体主要包括:函数、函数指针、函数引用、可以隐式转换为函数指定对象,或者实现了opetator()对象。...*③* *修改标示符* mutable声明,这部分可以省略。按传递函数对象参数,加上mutable修饰符,可以修改按传递进来拷贝(注意能修改拷贝,而不是本身)。...10.1 线程使用 10.1.1 线程创建std::thread创建线程非常简单,只需要提供线程函数或函数对象即可,并且可以同时指定线程函数参数

2.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

C++11新特性学习笔记

静态断言好处: 更早报告错误,我们知道构建早于运行,更早错误报告意味着开发成本降低 减少运行时开销,静态断言编译期检测,减少了运行时开销 语法如下: static_assert(常量表达式...使用constexpr,你可以创建一个编译函数: constexpr函数限制: 函数中只能有一个return语句(有极少特例) 函数必须返回(不能void函数) 使用前必须已有定义 return...std::function C++中,可调用实体主要包括:函数、函数指针、函数引用、可以隐式转换为函数指定对象,或者实现了opetator()对象。...*③* *修改标示符* mutable声明,这部分可以省略。按传递函数对象参数,加上mutable修饰符,可以修改按传递进来拷贝(注意能修改拷贝,而不是本身)。...10.1 线程使用 10.1.1 线程创建std::thread创建线程非常简单,只需要提供线程函数或函数对象即可,并且可以同时指定线程函数参数

2K20

C++11知识点总结(全面解析C++11经常考到知识点)

新增加容器—静态数组array、forward_list以及unordered系列 /* array 一个类似vector容器,但是保存在栈区,因此性能更好,不能够隐式转换为指针 编译创建固定大小数组..._str = nullptr; } 因为strRet对象生命周期创建好临时对象就结束了,即将亡,C++11认为其为,在用strRet构造临时对象,就会采用移动构造,即将strRet中资源转移到临时对象中...C++11中最重要特性就是对线程进行支持了,使得C++并行编程不需要依赖第三方库,而且原子操作中还引入了原子类概念。要使用标准库中线程必须包含头文件。...jion() 该函数调用后会阻塞住线程,当该线程结束,主线程继续执行 detach() 创建线程对象马上调用,用于把被创建线程线程对象分离开,分离线程变为后台线程创建线程"死活"就与主线程无关...注意:如果类成员函数作为线程参数必须将this作为线程函数参数。 11.3 join与detach 启动了一个线程,当这个线程结束时候,如何去回收线程所使用资源呢?

2K10

重温 CC++ 笔记

为了减少创建对象成本,C++ 11 引入了 (Rvalue) 和转移(move): 转移构造函数 转移赋值函数 对于比较重要构造、析构函数,可以使用 = default,让编译器生成默认实现...指针内存地址,引用是变量别名,指针可以是空,而引用不能为空(引用必须初始化,否则编译失败) 引用是通过指针常量实现 指针完全映射了计算机硬件,操作效率高, C++ 效率高根源。...//转发参数 ); } 09 exception #include C++ 处理异常方式: 判断函数返回 判断全局错误码,errno 业务逻辑和错误处理混在一起...很容易被忽略,出现异常还继续执行,导致出现意料之外情况 抛出、处理异常 错误处理集中 catch 代码块 异常不能被忽略,必须处理,否则向上传播,直到被处理或者崩溃。... #include #include using namespace std; //仅调用一次 //最好静态、全局线程可见) static

1.2K30

【笔记】《深入理解C++11》(上)

引用 ""没有严谨定义, 通常来说, 出现在等号右边内容就是, 可以取地址, 有名字就是左 不跟对象关联字面值等称为纯, 其他称为将亡 引用是为了优化对临时对象进行深拷贝效率...引用形成拷贝/赋值函数称为移动拷贝/赋值, 核心直接窃走目标对象内部指针指向内存内容, 然后置空目标对象指针 无论声明了左引用还是引用, 都必须在声明时立即初始化(参数列和初始化列表也算立即初始化..., 因此应该用noexcept修饰移动构造函数 move也有std::move_if_noexcept版本, 其在当前函数没有noexcept主动转换为应用从而调用拷贝构造版本....但显然这种做法损失性能 只要定义中出现了左引用, 引用折叠规则就会将其变为左引用, 这是std::forward()核心原理 编译器优化时候本身就打开了返回优化功能, 因此返回并不是很必要事...而且由于其本质常量数值原因, enum成员总是可以被隐式转换为整型, 这很容易导致比较两个不同枚举名称出现错误结果 C++11之前会通过类结构将枚举封装, 并建立新转换和比较函数覆盖原先操作

1.8K20

能向入口函数传入多个参数 QueueUserWorkItem

注意: 1、向入口函数传递引用,移动操作发生在创建线程成功调用入口函数前。...2、当 Args 参数包中包含“按传递”对象将发生一次(不同于 std::threadstd::async 等需要拷贝移 动和一次)拷贝构造行为,且拷贝构造发生在目标线程中而非调用线程,若拷贝构造过程发生异常则异常被传..._Func 绑定到之上对象指针,参见 示例1.2; 4、QueueUserWorkItemEx 完成参数拷贝返回,而非向线程任务队列投递任务立即返回;原因 若在目标线程拷贝参数前返回可能导致目标线程使用已被销毁对象...这可能会导致线程池依托任务队列建立 伸缩性失效,具体解决方法请参考注意事项第1条。 注意: 1、当Args参数包中参数数量不为零会引起等待;等待线程池中线程调用_Func 前参数拷贝完成。...4、参数传递过程可能包含隐式向引用或引用转换。不同于 std::threadstd::aysnc 等需要显示 std::ref 调用;见示例1.1。

1.2K20

《逆袭进大厂》第三弹之C++提高篇79问79答

C/C++函数参数通过压入堆栈方式来给函数传参数(堆栈一种先进数据结构),最先压入参数最后出来,计算机内存中,数据有2块,一块堆,一块栈(函数参数及局部变量在这里),而栈从内存高地址向低地址生长...1) 生命周期 静态成员变量从类被加载开始到类被卸载,一直存在; 普通成员变量只有创建对象才开始存在,对象结束,它生命期结束; 2) 共享方式 静态成员变量全类共享;普通成员变量每个对象单独享用...1) 更加安全; 2) 更直接明显,能够一眼看出是什么类型转换为什么类型,容易找出程序中错误清楚地辨别代码中每个显式强制;可读性更好,能体现程序员意图 176、成员函数里memset(this...,其他线程只有等待 互斥锁抢锁失败情况下主动放弃CPU进入睡眠状态直到锁状态改变再唤醒,而操作系统负责线程调度,为了实现锁状态发生改变唤醒阻塞线程或者进程,需要把锁交给操作系统管理,所以互斥锁在加锁操作涉及上下文切换...4) 引用通常不能绑定到任何,要想绑定一个左引用,通常需要std::move()将左强制转换为

2.2K30

Rust 错误处理

当前函数使用任何临时值、局部变量或参数都将按照与创建它们相反顺序被丢弃。丢弃一个仅仅意味着随后会进行清理:程序正在使用任何字符串或向量都将被释放,所有打开文件都将被关闭,等等。...清理了当前函数调用后,我们将继续执行到其调用者中,以相同方式丢弃其变量和参数。然后再“走到”那个调用调用者中,调用栈中逐级向上,以此类推。 最后,线程退出。...标准库函数 std::panic::catch_unwind() 可以做到这一点。本章不会介绍如何使用它,但这是 Rust 测试工具用于测试中断言失败进行恢复机制。...它针对大概率不会用到回退且计算回退会造成浪费情况。只有得到错误结果才会调用 fallback_fn。...GenericError 方法缺点返回类型不再准确地传达调用预期错误类型。调用必须做好应对任何情况准备。

5610

C++并发编程实战》读书笔记(1):并发、线程管控

不过参数先按默认方式复制到线程内部存储空间,再被当成临时变量以右形式传给线程函数。...解决办法传参直接转换为string。 std::thread t(f,std::string(buffer)); 如果线程函数形参引用,直接传入实参会被转化为再传入,导致错误。...C++线程库保证了一旦由线程锁住某个互斥,其他线程试图加锁必须等待,直到原先加锁线程将其解锁。注意应以合适粒度加锁,仅在访问共享数据期间加锁,处理数据尽可能解锁。...C++中通过构造std::mutex实例来创建互斥,通过lock/unlock成员函数来加锁解锁。并不推荐直接调用成员函数,应使用其RAII类lock_guard,构造加锁、析构解锁。...unique_lock移动不可复制,可以不同作用域间转移互斥所有权,用途让程序同一个锁保护下执行其他操作。

31430

一个线程(节选)

参数start_routine指定了线程函数,这里需要注意这个函数调用方式必须__cedel调用,由于C/C++中定义函数默认调用方式就是__cedel调用,所以一般很少有人注意到这一点。...(下文会介绍一个使用示例) 返回:如果成功创建线程,返回0;如果创建失败,则返回响应错误码,常见错误码有EAGAIN、EINVAL、EPERM。...//权宜之计,让主线程不要提前退出 31 } 32 33 return 0; 34} 当然,初学者使用std::thread容易犯如下错误:即在std::thread对象在线程运行期间必须有效...崩溃原因,当func函数调用结束,func中局部变量t(线程对象)就会被销毁了,而此时线程函数仍然在运行。这就是我所说,使用std::thread必须保证线程运行期间,其线程对象有效。...如果使用C++面向对象方式对线程函数进行封装,那么线程函数就不能实例方法,即必须静态方法。那么,为什么不能实例方法呢?

2.1K40

C++编程经验(12):C++11新特性

详情C++编程经验(9):智能指针 – 裸指针管得了我要管,裸指针管不了我更要管!...使用该修饰符参数列表不可省略(即使参数为空); 4.->return-type:返回类型。用追踪返回类型形式声明函数返回类型。我们可以不需要返回时候也可以连同符号”->”一起省略。...C++11为了解决这个问题,提供了std::move()方法来将左换为,从而方便应用移动语义。move将对象状态或者所有权从一个对象转移到另一个对象,只是转义,没有内存拷贝。...初始化构造函数,创建一个 std::thread 对象,该 std::thread 对象可被 joinable,新产生线程调用 fn 函数,该函数参数由 args 给出。...特点如下: 创建可以不锁定(通过指定第二个参数std::defer_lock),而在需要再锁定 可以随时加锁解锁 作用域规则同 lock_grard,析构自动释放锁 不可复制,移动 条件变量需要该类型锁作为参数

95220

Linux下精简线程实现

当函数返回,被等待线程资源被收回。如果线程已经结束,那么该函数会立即返回。 返回:0代表成功,失败返回错误号。 参数thread: 线程标识符,即线程ID,标识唯一线程。...int pthread_detach(pthread_t thread); 使主线程与该线程分离,线程结束,其退出状态不由其他线程获取,而直接自己自动释放。 返回:0代表成功,失败返回错误号。...(pthread_mutex_t *mutex); 返回:成功:0,失败错误码 条件变量 与互斥锁不同,条件变量用来等待而不是用来上锁。...静态函数访问非静态成员 使用pthread_create()创建线程时候,往里传函数必须静态函数,但是我们经常会需要在这个静态函数里访问类静态成员变量,那怎么办呢?...这里已知有两种方法解决这个问题: 1.创建线程,需要用arg往里传递回调函数参数,可以在这里把当前对象地址封装到回调函数参数arg里面,然后回调函数中使用这个对象地址来调用静态成员变量。

1.7K30

【笔记】《深入理解C++11》(下)

必须个常量表达式 常量表达式必须在使用前初始化, 但是如果没有代码用到其地址, 编译器可以不生成数据, 直接将常量表达式作为编译时期使用 编译浮点常量表达式精度至少要等于/高于运行时浮点数常量精度..."print %s%d\n", string("a"), 1); return 0; } /// 多种参数包展开效果 // 变长引用 // 牢记...本质...参数列表中进行了展开...TLS 线程局部存储(thread local storage; TLS)就是描述线程可见变量有哪些 首先线程显然拥有自己栈内存, 并且共享了堆空间, 全局和静态变量区 然而共享全局变量可能会在多线程读写中产生不确定结果..., 描述函数参数如何压入栈和由谁平衡栈约定, 直接将其写在函数名和返回之间位置 平衡栈: 函数返回由谁负责将压入栈函数参数清除 函数调用过程: 根据调用约定把函数参数压栈或存入寄存器 跳转到函数代码...以下windows常用调用约定 __cdecl C和C++默认调用约定, 参数向左入栈, 由调用者清理堆栈, 因此允许可变参数函数 __stdcall WINAPI别名, CALLBACK

1K30

CC++ 技术面试基础知识总结

引用 引用就是必须绑定到(一个临时对象、将要销毁对象)引用,一般表示对象。...,必须要构造函数调用完成才会形成虚表指针) 内联函数不能表现多态性虚函数,解释见:虚函数(virtual)可以是内联函数(inline)吗?...当读成功,read 返回实际所读字节数。 如果返回 0 表示已经读到文件结束了,小于 0 表示出现错误。...(2)返回小于 0,此时出现错误。 如果错误为 EINTR 表示时候出现了中断错误;如果为 EPIPE 表示网络连接出现了问题(对方已经关闭了连接)。...break; case DLL_THREAD_ATTACH: // 当进程创建一个线程时候,用于告诉DLL执行与线程相关初始化(非主线程执行) // A thread

1.6K20

C++ std::thread线程详解

线程支持 C++11 中引入 C++11 之前,我们必须使用 POSIX 线程或库。虽然这个库完成了这项工作,但缺乏任何标准语言提供功能集导致了严重可移植性问题。...C++ 11 取消了所有这些,并给了我们 std::thread线程类和相关函数头文件中定义。 类thread表示单个执行线程线程构建关联线程对象立即开始执行。...其定义用于观察和管理应用程序中执行线程对象。 2. 创建一个thread std::thread C++ 中表示单个线程线程类。...可调用对象可以是以下五个项中任何一个: 函数指针 Lambda 表达式 函数对象 非静态成员函数 静态成员函数 定义可调用对象,我们将其传递给构造函数。...线程任务移动和交换 没有两个 std::thread 对象会表示同一执行线程,因为 std::thread 移动构造且移动赋值,但不是复制构造或可复制赋值

51420

《Java核心技术 卷I:基础知识》读书笔记

4.5 方法参数 一般来说,存在按调用和按引用调用。Java总是默认采用按调用,但是需要注意,=赋值号一般总是直接复制对象地址,除非使用clone 这也就是说,方法得到所有参数一个拷贝。...最关键就是java.lang.reflect.Array.newInstance静态方法,它能够构造新数组,调用必须提供数组元素类型和数组长度。...6.3 接口与回调 callback一种常见程序设计模式,一般我js见比较多,或者说C++函数指针,某个事件发生,直接调用指定这个可变函数。...MyApp 11.4.2 使用断言完成参数检查 断言使用场景: 断言失败致命、不可恢复错误。 只用于开发和测试阶段。...,可以调用getState方法 14.3.1 新创建线程 New:当调用new Thread(r)线程还没有开始运行 14.3.2 可运行线程 一旦调用threadstart方法,就是可运行状态。

54720
领券