C++学习
TwT520Ly
人之所以能,是相信能!
展开
-
【C++学习】构造函数和析构函数
前言 我们不能通过对结构体列表初始化的方式对类的对象初始化。因为在类中,有的数据成员的访问权限是私有的,然后只有本类中的成员函数才能对类中的私有数据成员进行访问,因此只有通过设计合适的成员函数,才能对对象正确的初始化。(如果一个类中的所有数据成员都是公有的,就能采用列表初始化的方式,但是也就违背了类设计的初衷—-数据隐藏)一:构造函数:1.构造函数 一般来说,最好是在创建对象的时候就进行初始化。原创 2016-12-10 21:41:13 · 424 阅读 · 0 评论 -
【CUDA】CMakeLists实现CUDA编译
# 设置CMake版本cmake_minimum_required(VERSION 3.5)project(Test1)set(EXECUTABLE_OUTPUT_PATH ../)# 找到CUDA路径并导入头文件find_package(CUDA REQUIRED)include_directories(${CUDA_INCLUDE_DIRS})# 设置C++版本set(CMAK...原创 2018-07-18 11:16:05 · 6998 阅读 · 1 评论 -
【C++学习】C++实现高效内存池
1.内存池简介2.函数实现2.1 主函数2.2 StackAlloc.h2.3 StackAlloc.cpp2.4 禁用拷贝赋值2.5 静态断言与断言2.6 使用reinterpret_cast1.内存池简介内存池是池化技术中的一种形式,通常我们在编写程序的时候使用new和delete关键字向操作系统申请内存。但是每一个申请内存和释放内存的...原创 2018-07-05 20:15:41 · 1417 阅读 · 1 评论 -
【CUDA】分配内存使用void**
在cuda中分配内存的时候,都是使用void**进行内存的分配。对于一般情况:void memory(int* p) { p = (int*)malloc(10);}int main() { int* a = 0x0001; memory(a); return 0;}此时a指向的地址是0x0001,而且p指向的地址也是0x0001,但是a和p...原创 2018-07-18 16:21:59 · 1930 阅读 · 0 评论 -
【OpenMP】多线程计算过程中任务调度问题
对于OpenMP的任务调度主要针对于并行的for循环,当每一次循环过程中的计算时间复杂度不一致的时候,简单的给每一个线程分配相同次数的迭代,会导致线程计算负载不均衡。不仅如此,对于实时计算的计算机,每一个核心的占用率是不一样的。针对该问题,OpenMP中给出多种线程调度的方式。1. 基本使用#include <stdio.h>#include <omp.h>...原创 2018-07-07 11:30:48 · 1423 阅读 · 0 评论 -
【CUDA】设计优秀的CUDA程序
首先需要对我们的程序进行性能测试: (1)时间:使用CUDA事件的方式进行时间测试。 (2)内存带宽:根据运行时间和传入到核函数的数据内存量进行带宽计算。优秀的CUDA程序: 1. 在给定的数据规模下,选用算法的复杂度不明显高于最优的算法。 2. Active wrap(激活的线程束)的数量能够让SM载满,而且Active block的数量大于2,能够有效的隐藏访存延迟(使用足...转载 2018-07-19 17:10:19 · 449 阅读 · 0 评论 -
【OpenBLAS】BLAS、LAPACK、ATLAS、OpenBLAS区别
1.BLAS Basic Linear Algebra Subprograms,基础线性代数子程序。定义了一组API,可以进行向量之间乘法、矩阵之间的乘法等。使用Fortran语言开发的。2.LAPACK Linear Algebra Package,线性代数包,底层使用BLAS,使用Fortran语言编写。在BLAS的基础上定义很多矩阵和向量高级运算的函数,如矩阵分解、求逆和求奇异值等。...原创 2018-07-25 12:00:03 · 5328 阅读 · 0 评论 -
【C++】g++参数介绍(待整理)
参考:https://www.cnblogs.com/lidan/archive/2011/05/25/2239517.html原创 2018-09-25 10:15:59 · 435 阅读 · 0 评论 -
【汇编编程】查看汇编代码
#include &lt;iostream&gt;using namespace std;int main() { cout &lt;&lt; "Hello World!" &lt;&lt; endl; return 0;}文件保存为main.cpp,执行g++ -S main.cpp在同级目录下面生成main.s,是原始代码文件的汇编代原创 2018-09-21 20:10:19 · 2134 阅读 · 0 评论 -
【Neon】arm neon指令集指令解析
在arm neon的指令集中,大多数都是单词的缩写加一些特殊的前后缀修饰符。正常指令q 可以对任一向量类型执行运算,并生成大小相同且类型与操作数向量相同的结果向量。长指令l 长指令对双字向量操作数执行运算,并生成四字向量结果。所生成的元素通常是操作数元素宽度的两倍,并属于同一类型。宽指令w 宽指令对一个双字向量操作数和一个四字向量操作数执行运算。所生成的元素和第一个操作数的元素是...原创 2018-07-17 10:51:39 · 4899 阅读 · 0 评论 -
【C++学习】explicit修饰构造函数
在C++中,可以使用关键字explicit对类的构造函数进行修饰。被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。官方解释:禁止隐式调用类内的单参数构造函数。(1)该关键字只能用于修饰类内部的构造函数。 (2)该关键字修饰的构造函数只能是单参数构造函数,对于多参数构造函数是无效的。 (3)禁止隐式调用拷贝构造函数。 (4)禁止类对象之间的隐式转换方式。...原创 2018-07-09 17:40:20 · 1230 阅读 · 0 评论 -
【C++学习】C++运算符重载
c++中预定义的运算符的操作对象只能是基本数据类型,对于很多的用户自定义类型,也可以进行相似的运算符操作。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。 运算符重载的实质就是函数重载。 基本过程:首先要把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的重载类型函数。一:运算符重载的规原创 2017-01-02 16:23:49 · 765 阅读 · 0 评论 -
【C++学习】关于C++中定义和声明的区别
声明:只是说明一个变量或者是一个类的结构,在声明的过程中,是不会为其分配空间的,编译器仅仅只对其进行词汇分析和名字的判定,不会占用任何内存。 定义:表示对于该对象而言是占用内存的,即在相对内存地址上进行对象定址。1.对于变量和对象不加extern表示的是定义,否则是声明,也就是说使用关键字extern修饰的变量和对象是不占用内存的。 2.类是声明,但是类成员的函数体是定义。 3.函数只有...原创 2018-04-16 19:40:28 · 239 阅读 · 0 评论 -
【C++学习】C语言编译链接过程
将一个后缀为.c的源文件转换为可执行文件的过程就是编译与链接。编译:将文本形式的源代码转换为机器语言形式的目标文件的过程。 链接:将目标文件、操作系统的启动代码和用到的库文件结合为最终可执行代码的过程。对于编译阶段分为两个阶段:编译、汇编;编译阶段又分为预处理阶段、编译优化阶段。预处理阶段:预处理阶段根据文件中的预处理指令来对源文件进行修改。主要包括:宏定义指令、条件编译指令、头文件...原创 2018-04-23 14:10:35 · 352 阅读 · 0 评论 -
【C++学习】如何在Clion中生成多个可执行文件
在构建一个新的Clion工程的时候,会自动生成一个文件夹cmake-build-debug,可以帮助我们快速的对整个C++工程进行编译运行。而主函数编译后生成的可执行文件就位于cmake-build-debug文件夹下面。如果我们需要在一个C++工程中构建多个主函数并生成多个可执行文件的话,我们就需要对CMakeLists.txt进行修改。具体步骤如下:(1)如果我们创建了两个主函数文件,...原创 2018-04-24 10:54:21 · 7794 阅读 · 3 评论 -
【C++学习】在编译过程中出现的错误“未定义的引用”
在编译为目标文件的时候是没有问题的,但是在编译的过程中(其实是链接的过程),生成可执行文件的时候找不到”XXX”的定义。xxx.cpp(.text+0x1000):对'A'未定义的引用原因是将C/C++编译为obj文件的时候并不需要函数的具体实现,只需要有函数的原型即可。但是在编译为可执行文件的时候,需要找到函数的具体实现。 因此未声明的引用是头文件引入错误,而未定义的引用是函数的实...原创 2018-05-09 18:11:24 · 25383 阅读 · 0 评论 -
【C++学习】CMakeLists核心功能
设置可执行文件的输出路径set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Path})设置可执行文件的输出add_executable(${EXE_FILE} ${MAIN_FILE})原创 2018-05-09 21:21:28 · 433 阅读 · 0 评论 -
【C++学习】JNI编译--无法找到jni_md.h
在linux中使用jni编译的过程中,找不到jni_md.h。是因为在/usr/lib/jvm/java-8-openjdk-amd64/include/中的jni.h,#include "jni_md.h"找不到,jni_md.h文件位于linux文件夹下面。但是并不建议直接修改源码。解决方案gcc -I /usr/lib/jvm/java-8-openjdk-amd64/inclu...原创 2018-04-26 14:46:31 · 3095 阅读 · 0 评论 -
【C++学习】C++多线程初步入门---thread库
对于多线程编程,一个是并行,另外一个是并发。并行是指两个或多个独立的操作同时进行。并发是指在一个时间段内执行多个操作。例如,在常见的四核四线程可以并行四个线程,但是对于四核八线程是使用了超线程技术,把一个物理模拟为两个逻辑核心。1 并发编程的方法1.1 多进程并行1.2 多线程并行2 C++11 线程的使用方式3 线程管理3.1 启动一个线程3.2 异常情况下等待线程完...原创 2018-07-09 17:25:51 · 1304 阅读 · 0 评论 -
【C++】测试时间
为了精准的获取程序块的运行时间,使用sys/time.h进行时间测试。struct timeval start;struct timeval end;unsigned long Time = 0;gettimeofday(&start, NULL);...gettimeofday(&end, NULL);Time = 1000000 * (end.tv_sec -...原创 2018-10-08 17:48:01 · 632 阅读 · 0 评论