随笔分类 - c/c++
摘要:打印栈回溯 #include "execinfo.h" #include "stdio.h" #include "stdlib.h" void print_stacktrace() { int size=128; void* array[128]; int stack_num = backtrace
阅读全文
摘要:Lambda 表达式完整的格式如下: [捕获列表] (形参列表) mutable 异常列表-> 返回类型 { 函数体 } 各项的含义: 捕获列表:捕获外部变量,捕获的变量可以在函数体中使用,可以省略,即不捕获外部变量。 形参列表:和普通函数的形参列表一样。可省略,即无参数列表 mutable:mut
阅读全文
摘要:在用cmake编译cuda程序时,总是报Compilation error ptxas fatal : Value ‘sm_30’ is not defined for option ‘gpu-name’问题,也是折腾了好久,感谢这位小哥的解决方案,亲试无误,万分感谢~ 转载:https://blo
阅读全文
摘要:thread ID 的计算方式,简单来说很像小学学的除法公式,本文转载自同学一篇博客;并进行简单修改; 被除数 = 除数 * 商 + 余数 用公式表示:$$线程Id = blockId * blockSize + threadId$$ **blockId** :当前 block 在 grid 中的坐
阅读全文
摘要:转载:https://blog.csdn.net/weixin_41969690/article/details/108006834 C++可重入函数和不可重入函数 **可重入函数**是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确不必担心数据错误的函数。 **不可重入函数**是指不能运
阅读全文
摘要:### 什么是死锁 死锁是指两个(或多个)线程相互等待对方数据的过程,死锁的产生会导致程序卡死,不解锁程序将永远无法进行下去。 ### 资源 大部分的死锁都和资源有关,在进程对设备、文件具有独占性(排他性)时会产生死锁。把这类需要排他性使用的对象称为资(resource)。资源主要分为**可抢占资源
阅读全文
摘要:在阅读tvm源码时,发现了一个挺有意思的代码: ```C++ std::vector> update; ``` vector容器里竟然存储的是键值对,amazing啊!!!还是第一次遇到这种写法的,这与直接写成map有啥不一样呢? 首先,这两种方式都可以用于存储键值对,只是它们具有不同的特性和实用场
阅读全文
摘要:这是一篇科普文--关于thread_local关键字 首先,C++11之前并没有对并发进行任何的支持,C++11首次提供了以下的支持: 语言核心定义了一个内存模型,保证当更改"被两个不同线程使用"的两个object时,他们彼此独立,而引用thread_local关键字 标准库支持启动多线程,包括传递
阅读全文
摘要:好吧,承认是自己浅薄了 当被问起C++重载时,嘴角不自觉的微微上扬,然后脱口而出,C++重载的原则: 函数名相同,函数参数列表不同(类型、个数、顺序) 匹配原则1:严格匹配,找到再调用 匹配原则2:通过隐式类型转换寻求一个匹配,找到则调用 注:返回类型不构成重载条件 C++编译时多态也是由重载函数来
阅读全文
摘要:函数的调用其实是函数的入栈出栈操作,但当程序栈因程序的错误导致破坏了栈,这时候就会导致gdb解析core文件时解析不出来的情况,即是问号(?) 那还能做点什么呢? 可以通过打印$rbp$和$rsp$的值得到最后调用栈的栈底和栈顶。 (gdb) p $rbp $40 = (void *) 0x7fff
阅读全文
摘要:以 C++ 为底层基础,Python 作为上层建筑,共同搭建起高性能、易维护、可扩展的混合系统。 Python 本身就有 C 接口,可以用 C 语言编写扩展模块,把一些低效耗时的功能改用 C 实现,有的时候,会把整体性能提升几倍甚至几十倍。 使用 C++ 来开发 Python 扩展。认为其中最好的一
阅读全文
摘要:值分左右 C++表达式的值类别: 这些名词的字面含义: 一个lvalue是通常可以放在等号左边的表达式,左值 一个rvalue是通常只能放在等号右边的表达式,右值 一个glvalue是generalized lvalue,广义左值 一个xvalue是expiring value,将亡值 一个prva
阅读全文
摘要:在对象切片一文中,提到可使用充当智能指针的类shape_wrapper,可以简化资源的管理,从根本上消除资源(包括内存)泄漏的可能性,本节来看下如何将shape_wrapper改造成一个完整的智能指针。 先来看下这个类: class shape_wrapper { public: explicit
阅读全文
摘要:C++支持将对象储存在栈上,但很多情况,对象不能,或不应该存储在栈上。比如: 对象很大 对象的大小在编译时不能确定 对象是函数的返回值,但由于特殊的原因,不应使用对象的值返回 常见情况之一是,在工厂方法或其他面向对象编程的情况下,返回值类型是基类(的指针或引用)。 举例:是对工厂方法的简单演示: e
阅读全文
摘要:背景: 打算采用以迭代器的方式递归进行二分查找,具体代码如下: 该模板函数以该target元素的迭代器的方式返回 template <typename IterT, typename ValueT = typename std::iterator_traits<IterT>::value_type,
阅读全文
摘要:因该方法实现与之前记录的不同,就想着记录下。。。 重点inplace_partition函数的实现 注意:迭代器范围都是左闭右开的区间 std::iter_swap(last_greater, --first_equal); if(comp(*last_greater, pivot)) { std:
阅读全文
摘要:vector的resize:既分配了空间,也创建了对象,会调用构造函数 vector的reserve:reserve()表示容器预留空间,但不是真正的创建对象,需要通过insert()或push_back()等操作创建对象 reserve()只修改capacity大小,不修改size大小, resi
阅读全文
摘要:###make_shared的使用 shared_ptr<string> p1 = make_shared<string>(10, '9'); shared_ptr<string> p2 = make_shared<string>("hello"); shared_ptr<string> p3 =
阅读全文
摘要:###重要结论 有效地利用二级指针,将其作为管理和操作链表的首要选项 ###问题的引入 在对链表进行删除操作时,函数参数的参数为二级指针,代码如下: struct single_list* del(struct single_list **prev) { struct single_list *tm
阅读全文
摘要:为什么大多数编程语言中,数组要从 0 开始编号,而不是从 1 开始呢? 从数组存储的内存模型上看: “下标”最确切的定义应该是**“偏移(offset)”** 用a表示数组的首地址,a[0]就是偏移为0的位置,也就是首地址,a[k]就表示偏移k个type size的位置,所以计算a[k]的内存地址只
阅读全文