c-c++
蓝鲸123
做更好的自己
展开
-
c++ 自动转换数据类型
template <typename T>struct CudaSupportedTypeImpl { using type = T;};template <>struct CudaSupportedTypeImpl<long long> { using type = unsigned long long;};template <>struct CudaSupportedTypeImpl<unsigned long> {原创 2022-03-30 10:50:12 · 1121 阅读 · 0 评论 -
grpc server、client 的c++和python的样例
具体的代码参见:https://github.com/wu-yy/grpc_test原创 2022-03-25 23:52:02 · 2003 阅读 · 0 评论 -
c++ RVO
RVO,是Return Value Optimization。这是在函数返回返回值的时候编译器所做出的优化,是C++11标准的一部分,C++11称之为copy elision。在第一次编写的函数里面,编译器明确知道函数会返回哪一个局部对象,那么编译器会把存储这个局部对象的地址和存储返回值临时对象的地址进行复用,也就是说避免了从局部对象到临时对象的拷贝操作。这就是RVO。实验实验1#include <iostream>struct Foo { Foo() { ..原创 2021-11-26 00:38:26 · 1088 阅读 · 0 评论 -
c++ allocator_traits
#include <cstddef>#include <iostream>#include <memory>#include <vector>// g++ allocator_traits_test.cpp -std=c++11 -fPIC -Ofast -D_GLIBCXX_USE_CXX11_ABI=0 -o allocator_traits_testtemplate <class T>struct custom_alloca原创 2021-10-12 23:21:21 · 698 阅读 · 0 评论 -
c++ dlopen、dlsym
// 加载动态库Status LoadLibrary(const char* library_filename, void** handle) { *handle = dlopen(library_filename, RTLD_NOW | RTLD_LOCAL); if (!*handle) { return errors::NotFound(dlerror()); } return Status::OK();}// 加载symbolStatus GetSymbolFromL原创 2021-09-03 11:21:30 · 687 阅读 · 0 评论 -
Register注册工厂
注册工厂class FileSystemRegistry { public: typedef std::function<FileSystem*()> Factory; virtual ~FileSystemRegistry(); virtual Status Register(const string& scheme, Factory factory) = 0; virtual FileSystem* Lookup(const string& scheme原创 2021-09-03 10:51:52 · 302 阅读 · 0 评论 -
SIMD and Avx2
SIMD 一条指令可以执行多个数据group的计算和输出。对于SIMD相对应的SISD.intel SSE2 , AVX2, AVX-512假设有一个任务是统计字符串中每一个字符出现的次数,我们可以用128bit 的SISD指令进行统计。每8个bit代表一个字符,所以只需要两个SIMD指令(move mask、pop count)。详细测试:#include <stdio.h>#include <thread>#define INC_TO 1000000 // o原创 2021-06-07 00:09:29 · 427 阅读 · 0 评论 -
char 与 unsigned char的本质区别
在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,8个bit,最多256种情况,因此无论如何都能表示256个数字。主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。但是我们却发现在表示byte时,都用unsigned原创 2021-06-06 12:29:05 · 574 阅读 · 0 评论 -
c++ atomic 详细讲解
1. 什么样的type 可以转化成atomic?任何 trivially copyable 的数据可以被转换成atomic.#include <iostream>#include <type_traits> struct A { int m;}; struct B { B(B const&) {}}; struct C { virtual void foo();}; struct D { int m; D原创 2021-05-22 22:19:57 · 11303 阅读 · 9 评论 -
atomic memory 原子内存拷贝
下面的方法更快而且对于cache的压力更小// Simpler structurestruct record { int spin = 0; char data[64];};struct record *node;while (node->spin || ! __sync_bool_compare_and_swap(&node->spin , 0 , 1)); // spinmemcpy(destination,source,NoOfBytes);n原创 2021-04-15 21:30:18 · 500 阅读 · 0 评论 -
unqiue_ptr<void>
#include <iostream>#include <string.h>#include <unordered_map>#include <chrono>#include <vector>using std::string;string handle_;void set_handle(string handle) { handle_ = std::move(handle);}#include <iostream&g原创 2021-01-07 10:19:16 · 393 阅读 · 1 评论 -
c++ constexpr 关键字
先看一个简单的例子: class test{ public: constexpr test(){ } constexpr int operator + (const test& rhs){ return 1; }};int main() { test t; constexpr int b = t + test(); // 可以编译通过 int w = 10;原创 2020-12-27 00:52:46 · 316 阅读 · 0 评论 -
C++模板进阶指南:SFINAE
来自于 Substitution failure is not an error 的首字母缩写。Substitution,Failure和Error三个词构成。详细的参考:cpprefernceSFINAE保证了在编译时期对类型进行推断,如果你拥有一个模版函数。你有两种需求,第一种是模版函数只支持特定类型的参数。第二种需求是对于重复定义函数发生的编译错误,通过SFINE放在函数的参数列表中,以此避免参数重复定义报错。。第一种是模版函数只支持特定类型的参数#include <iostream原创 2020-12-05 17:38:27 · 388 阅读 · 0 评论 -
c++ 单例模式Instance
class Elem { Elem * Instance() { static Elem* instance = nullptr; static std::once_flag s_flag; std::call_once(s_flag, [&]() { instance = new Elem; } ); return instance; }}原创 2020-11-08 21:06:42 · 896 阅读 · 0 评论 -
std::unique_ptr 独占所有权智能指针
std::shared_ptr , 允许多个指针指向同一个对象std::unique_ptr, 独占所指向的对象。std::unique_ptr 是 c++11中用来取代 std::auto_ptr 指针的指针容器。 它不能与其他unique_ptr类型的指针对象共享所指对象的内存。这种所有权仅能够通过std::move函数来转移。unique_ptr是一个删除了拷贝构造函数、保留了移动构造函数的指针封装类型。初始化quniue_ptrstd::unique_ptr<int> int_原创 2020-10-25 16:19:45 · 503 阅读 · 0 评论 -
c++ 线程池
#include <thread>#include <mutex>#include <atomic>#include <condition_variable>#include <functional>#include <vector>#include <queue>using Task = std::function<void()>;class ThreadPool { public: .原创 2020-09-17 00:46:58 · 132 阅读 · 0 评论 -
c++ undefined references with static library
出现错误的原因是c++程序调用c的静态库。静态库的头文件不带 extern “C”所以链接器寻找一个损坏的函数名字。静态库不包含损坏(mangled function name)的函数名字。如何c++使用c的静态库可以参考:https://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html...原创 2020-08-29 09:05:27 · 410 阅读 · 0 评论 -
C 利用宏求结构体成员的偏移值或者根据成员的地址求得结构体的地址
C程序的时候,有时候需要根据结构体成员变量的地址,得到结构体的地址,特别是我们想用C来实现C++的继承特性的时候。结构体的地址表示:struct father_t {int a;char *b;double c;}f;//而不是 ptr = f.b; 这里ptr是b的地址,而不是它指向的地址。char *ptr = &(f.b);结构体的存储:开始地址 存储大小0 ------- a(4 bytes)4 ------- b(4bytes)8 ---原创 2020-06-23 19:33:51 · 1134 阅读 · 1 评论 -
在JIT编译时期进行类型检查
#include <iostream>#include <list>#include <vector>using std::list;#include <map>template <typename T>using vector = std::vector<T>;#define DEF_IS(check_type, return_type) \ template<class T> \ typ原创 2020-05-24 13:24:10 · 299 阅读 · 0 评论 -
c++ 实现对象迭代器
#include <iostream>#include <list>#include <vector>using std::list;template <typename T, typename To>struct Caster { list<To> *ptr; Caster(list<To>* ptr) : ptr(ptr) {}; struct Iter { typename l原创 2020-05-23 16:13:40 · 506 阅读 · 0 评论 -
c++ 编译动态库出现undefined symbol
如何debug可以使用nm指令查看undifined simbol的编译的位置:nm -D test.so 输出:000000000099a4dc B _ZN7teaflow9ns_uint64E0000000000213a10 T _ZN7teaflowlsERSoPKNS_2OpE0000000000204e00 T _ZN7teaflowlsERSoPKNS_3VarE U _ZN7teaflowlsERSoPKNS_4NodeE00000000002原创 2020-05-23 09:56:57 · 2608 阅读 · 0 评论 -
c++ syntax new (this) T(t) 不用额外分配内存,直接copy
T& T::operator=(const T&t) { ... new (this) T(t); ...}new (this) T(t) 也叫做“new placement operator”。在括号中指定地址构造一个对象。例如copy赋值操作可以被下面的代码定义:T& T::operator=( const T& other) { if ( this != &other ) { this->~T(); // li原创 2020-05-19 11:07:04 · 614 阅读 · 1 评论 -
c++ typeid和type_index
typeid查询类型的信息。用于必须知晓多态对象的动态类型的场合以及静态类型鉴别。使用方法头文件: #include<typeinfo>typeid(类型) 或者typeid(表达式)指代一个表示 类型 的 std::type_info 对象。若 类型 为引用类型,则结果所指代的 std::type_info 对象表示被引用的类型。检验表达式a) 若 表达式 为标识某...原创 2020-05-03 08:52:44 · 2833 阅读 · 0 评论 -
函数指针
函数指针也是一种指针,只是它指向的不是整型,字符型而是函数。在C中,每个函数在编译后都是存储在内存中,并且每个函数都有一个入口地址,根据这个地址,我们便可以访问并使用这个函数。函数指针就是通过指向这个函数的入口,从而调用这个函数。函数指针的定义函数指针虽然也是指针,但它的定义方式却和其他指针看上去很不一样,我们来看看它是如何定义的:/* 方法1 */void (*p_func)(int, ...原创 2020-04-22 19:01:16 · 472 阅读 · 0 评论 -
类似gflag定义全局变量
#include <iostream>#include <map>#include <tuple>#include <sstream>template<class T> T get_from_env(const char* name,const T& _default) { auto s = getenv(name)...原创 2020-04-08 22:06:38 · 320 阅读 · 0 评论 -
打印文件名和文件行调试信息
#include <iostream>#include <map>#include <tuple>// #include "types.h"namespace teaflow {// 从 __FILE__ 找到文件的名constexpr int32_t basename_index(const char * const path, const in...原创 2020-04-08 16:23:45 · 198 阅读 · 0 评论 -
bazel 安装与手动安装tensorflow
1 . 安装bazel 需要的jdk-8sudo apt-get install openjdk-8-jdk在Ubuntu 14.04 LTS上,您必须使用PPA:sudo add-apt-repository ppa:webupd8team/javasudo apt-get update && sudo apt-get install oracle-java8-ins...原创 2020-02-28 10:01:13 · 1816 阅读 · 0 评论 -
valgrind 检查内存泄漏
valgrind --leak-check=full --log-file=v.log原创 2020-02-18 22:18:22 · 335 阅读 · 0 评论 -
c文件读写
关于c 里面的 open 可以参考链接#include <string>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>struct feature_data { int score; std::stri...原创 2020-02-07 17:30:47 · 221 阅读 · 0 评论 -
gdb 调试技巧
打印堆栈的信息bt full查看函数的输入参数info argsx /nfu x 是 examine 的缩写x/20a $rspx/2s $rspx/1a $rax打印汇编代码disassemblep/x $rbpp/x $raxp/x $rip原创 2020-02-05 14:39:06 · 365 阅读 · 0 评论 -
c++中的类型转换--reinterpret_cast
reinterpret_cast作用为:允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。语法还是老样子:reinterpret_cast < type-id > ( expression )滥用 reinterpret_cast 运算符可能很容易带来风险。 除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。reinter...原创 2019-12-31 16:47:25 · 784 阅读 · 0 评论 -
C++中Vector保存 原始指针和智能指针的析构问题
std::vector<std::shared_ptr > param;param中vector析构的时候,里面的智能指针会释放。Vector保存智能指针是可以释放智能指针 所指向的对象的std::shared_ptr<std::vector> param;C++的Vector 保存原始指针 的时候 Vector 析构的时候是不会释放指针指向的堆对象,...原创 2019-12-31 15:52:28 · 3380 阅读 · 0 评论 -
c++ vector删除元素,使用unique ,erase
//// Created by wuyongyu on 2019-10-10.//#include <iostream>#include <string>#include <thread>#include <mutex>#include <chrono>#include <vector>#include &...原创 2019-10-11 20:43:33 · 1004 阅读 · 0 评论 -
someothing about google protobuffer
1 . clear_…原创 2019-08-30 08:24:33 · 208 阅读 · 0 评论 -
函数存储在stack中,执行
int g_test1 = 0;int g_test2 = 0;void IncrementC1(void* unused) { ++g_test1;}typedef void (*AtExitCallbackType)(void*);struct CallbackAndParam { CallbackAndParam(AtExitCallbackType func, void...原创 2019-08-31 18:38:57 · 262 阅读 · 0 评论 -
std::shared_mutex
c++ 17 新出的具有独占模式和共享模式的锁。共享模式能够被 shared_lock 占有。可以参考代码:#include <iostream>#include <mutex> // For std::unique_lock#include <shared_mutex>#include <thread> class ThreadSaf...原创 2019-10-10 09:07:04 · 996 阅读 · 0 评论 -
c++互斥 和 std::call_once
在线程之间访问共享数据需要通过互斥锁来同步,保证同一时刻只有一个线程可以访问(或者只有一个线程进行写操作)。C++11起,标准库提供std::mutex以满足开发者对互斥锁的需求,相关的变体还有许多,如recursive_mutex,timed_mutex,shared_mutex等等。注意,mutex不可复制,不可移动(move)。std::recursive_mutex 是递归锁,和mut...转载 2019-10-10 09:19:57 · 261 阅读 · 0 评论 -
c++ 条件变量
//// Created by wuyongyu on 2019-10-10.//#include <iostream>#include <string>#include <thread>#include <mutex>#include <chrono>#include <condition_variable>...原创 2019-10-10 09:57:28 · 302 阅读 · 0 评论 -
阻塞多个线程执行完成,主要使用 std::future 、std::promise
使用的下面场景,在 future 等待的阶段会使用for 循环等待搜索的future都执行完毕(std::promise 设置value)。#include <iostream>#include <string>#include <thread>#include <mutex>#include <chrono>#include...原创 2019-10-10 22:51:04 · 1073 阅读 · 0 评论 -
cmake 常用命令,生成可执行文件
#项目的名称PROJECT(SAMPLE)#cmake 的版本cmake_minimum_required(VERSION 2.4)# 查找是否安装了OpenCVFIND_PACKAGE(OpenCV REQUIRED )IF(${OpenCV_VERSION} VERSION_LESS 3.4.5) MESSGAE(FATAL_ERROR “OPENCV version ...原创 2019-03-01 11:59:27 · 3291 阅读 · 0 评论