KeLiaoo
码龄8年
关注
提问 私信
  • 博客:12,373
    问答:2,171
    14,544
    总访问量
  • 12
    原创
  • 1,111,313
    排名
  • 5
    粉丝
  • 0
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:湖北省
  • 加入CSDN时间: 2016-08-25
博客简介:

KeLiaoo的博客

查看详细资料
个人成就
  • 获得13次点赞
  • 内容获得3次评论
  • 获得27次收藏
创作历程
  • 8篇
    2021年
  • 4篇
    2020年
成就勋章
TA的专栏
  • c++
    11篇
  • git
    1篇
  • cmake
    1篇
  • OSG
  • OpenGL
    1篇
  • 笔记
  • coroutine
    1篇
创作活动更多

AI大模型如何赋能电商行业,引领变革?

如何使用AI技术实现购物推荐、会员分类、商品定价等方面的创新应用?如何运用AI技术提高电商平台的销售效率和用户体验呢?欢迎分享您的看法

186人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

git入门:commit的二义性 -- 从中学数学学习git

本文并不打算介绍如何使用git,也不会从源码和实现的角度去分析git,而是从设计理念的角度介绍git的相关概念,帮助大家更好的使用git。如果要具体学习相关命令,强烈推荐大家从这个网站开始学习。commit与数列求和我们知道,在软件开发中,会有许多不同的版本,每一个版本相对父版本都会有一定的改动。把改动累积起来会得到版本。这个过程和我们在中学中学过的某个概念非常相似–数列求和:求和数列时,会有多个an,把an累加起来会得到sn。这两个概念非常相似,也给了我们理解git工作方式的一个灵感。回到git
原创
发布博客 2021.11.10 ·
323 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

c++入门系列:pod类型

众所周知,虽然c++在一定程度上是c的超集,但c++和c有很大的不同,其中之一,就是c++的类和c的结构体有很大的区别。在c++中,如果一个类和c中的结构体相同,这样的类被称作pod(plain old data),可以通过std::is_pod检查一个类是否是pod类。下文会介绍pod的相关要求:pod的组成在c++,对于一个pod的类要满足那几条要求做了一个详细的概括,具体来说,is_pod可以拆分为is_trivial和is_standard_layout,is_trivial又可以拆分成is_t
原创
发布博客 2021.10.30 ·
533 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

c++入门系列:函数指针类型与函数类型的区别

以下是一个简单的例子,分别把成员函数指针的类型和函数指针的类型以及成员指针的类型做了一个比较。值得注意的是,由于普通的函数无法拷贝,在早期的语法中,并没有特意区分函数和函数指针,使得它们可以互相转换,但最好不要这么写。#include <type_traits>#include <iostream>struct foo{ int a; int dummy(void) { return 1; }};int dummy(void) { return 1;
原创
发布博客 2021.10.08 ·
505 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

OpenGL状态机设计思路剖析

概述学会一门图形api并不容易,除了图形学算法以外,还得花时间去理解图形api本身的架构。对于OpenGL而言,这个架构就是它的状态机模型,由于OpenGL版本的不断迭代,整个架构发生了一定的迭代,不同版本的api风格不一致,导致初学者更难入门。不过,如果能抓住一定的脉络,整个api的架构也会变得相当清晰。下文中,将会按照迭代的顺序,对OpenGL状态机架构的常见设计做一个阐述。buffer object和target在最早期的立即模式的OpenGL中,是不存在buffer object这个概念的。如
原创
发布博客 2021.09.13 ·
693 阅读 ·
2 点赞 ·
0 评论 ·
5 收藏

c++入门系列:怎么找到一个变量?

初次接触指针的同学可能会有一个疑问,指针指向了变量的地址,程序可以通过指针找到变量,那么,程序要怎么找到指针呢?是通过另一个指向指针地址的指针吗?如果是这样,那又怎么找到另一个指向指针地址的指针呢?会不会一直迭代下去,源头在哪里呢?事实上,这个问题并不难,只要对c++内存模型有一定的理解,很快就能想清楚这个问题。源头在栈区和静态变量区。静态变量区是源头很好理解,存在在静态变量区的对象的地址在编译期就被计算出来,是一个确定的值。在栈区的变量呢?事实上,在编译期可以计算出运行时栈顶的地址相对栈上变量地址的偏
原创
发布博客 2021.07.15 ·
542 阅读 ·
2 点赞 ·
0 评论 ·
0 收藏

差点骗过编译器的一段代码

最近写了一个比较复杂的算法,这个算法复杂在哪呢?有很多不同的index,index组成的数组的index,index组成的数组的index组成的数组的index,一眼看过去,虽然通过命名对不同的index做了区分,却还是很难分清楚,到底这个index对应哪个数组。基于这一点,我打算设计一个专属index类,让index静态的和所指向的数组静态绑定,大概是这样:#include <vector>template<std::vector<int> *ptr>struc
原创
发布博客 2021.07.09 ·
157 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

C++ 静态多态

多态是面向对象的基本思想。一般情况下,我们会采用虚函数和虚函数表的方式实现多态,也就是动态多态。但是,如果采用虚函数实现多态,会对代码的性能造成一定的影响。(查找虚函数表的开销其实不大,虚函数影响性能的主要原因是虚函数会影响内联和优化。)和常见的优化思路一样,把动态变为静态。很多代码实际上不需要到运行时才知道应该调用哪个虚函数,使用虚函数仅仅只是因为子类需要调用父类的虚函数。对于这种情况,我们不需要虚函数表,可以采用静态多态,一般通过crtp技术来实现静态多态。当然,在一些需求下,比如迭代的访问vect
原创
发布博客 2021.06.19 ·
1293 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

C++中关于重载前置自增运算符的问题

答:

 

friend My& operator++(My p);改成

friend My& operator++(My& p);

回答问题 2021.02.02

VS2019中的错误

答:

链接lib

回答问题 2021.02.02

c++ 派生类Boy转换成派生类Girl的转换问题

答:

静态转换就是这样的啊??静态转换就是直接转换,不会去管指针到底绑定了什么对象,不用dynamic_cast不可能返回nullptr。

回答问题 2021.01.27

数据结构的书为什么都这么垃圾

答:

直接刷leetcode,看书浪费时间

回答问题 2021.01.27

C++多继承下多态内存释放问题

答:
#include <iostream>
#include <string>
using namespace std;

class Animal1
{
public:
    virtual void fun1() {}
    //virtual ~Animal1(){}
};
class Animal2
{
public:
    virtual void fun2() {}
    virtual ~Animal2(){}
};

class Cat : public Animal1, public Animal2
{
public:
    virtual void fun1()
    {
        cout << "fun1" << endl;
    }
    virtual void fun2()
    {
        cout << "fun2" << endl;
    }
};

int main(void)
{
    Cat* c = new Cat;
    Animal2* a2 = c;
    delete a2;
    return 0;
}
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif
}

如果给animal2写了虚析构函数,block和c是相等的,如果没写,block和a2是相等的。

回答问题 2021.01.22

C++多继承下多态内存释放问题

答:

我仔细研究了一下这个问题。

当你delete时,最终都会调用这么一个函数(vs2019):

void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif
}
也就是说,当你delete时,如果没有析构函数,到底怎么回收内存,仅仅是由指针所指的地址确定的,和指针的类型无关,指针的类型在这里没有作用。

然后回到你这个问题,事实上,delete a1时是没有错误的,错误出现再delete a2。原因很好猜到,a1所指的地址就是Cat对象的首地址,所以delete a1可以正常运行;但是a2 所指的地址不是Cat对象的首地址,由于这里是多继承,a2所指的地址相对Cat对象的首地址有偏移,编译器发现它自己没有给这个地址分配空间,所以就报错了。

为什么加了析构函数后运行正常呢?原因也很简单,delete这个运算符,是先调用析构函数,再回收内存。前面是没有析构函数,所以不会变动,现在有了析构函数,在析构函数结束时会把偏移过的地址改回原样,这一点很容易验证。地址对了回收内存自然也对了。

回答问题 2021.01.22

C++多继承下多态内存释放问题

答:

口误,释放的堆区空间不一样

回答问题 2021.01.22

C++多继承下多态内存释放问题

答:

不是让你用sizeof了吗?基类和派生类的大小都不一样,所以你delete基类指针释放的栈区空间和delete派生类指针释放的栈区空间不一样,当然会跑飞了。

事实上,这里Animal1和Animal2存了一个虚函数表的指针,Cat存了两个虚函数表的指针。

回答问题 2021.01.22

C++多继承下多态内存释放问题

答:

派生类必须有虚析构函数,否则有可能挂掉。

你可以分别用sizeof看一看这三个类的大小就知道为什么崩溃了。

回答问题 2021.01.21

c++从返回值优化到右值

c++返回值优化与右值这篇博客一开始是想写c++左值和右值的区别,不过,c++发展到现在,左值和右值的区别已经成了一团乱麻,即使是在标准里,也是单独对每一个表达式去定义是左值还是右值,想要直接把左值和右值概括清楚还是比较麻烦的。所以,这篇博客暂时只讲返回值优化,并介绍返回值优化和右值的关系。返回值优化的基本情况考虑这样一种情况:定义一个对象,对这个对象进行一些操作后,再把这个对象用来初始化另一个对象。初始化完成后,这个对象不再被使用。例程如下:struct foo{};int main(){
原创
发布博客 2021.01.16 ·
1871 阅读 ·
3 点赞 ·
3 评论 ·
5 收藏

c++类中的成员函数与非成员函数除了位置外还有什么区别吗?何时要把函数做成成员函数,何时做成非成员?

答:

成员函数有一个隐式的this指针作为参数。

用成员函数还是非成员函数主要是概念上的区别。

回答问题 2021.01.11

C++结构体数组,数组名不允许显示不完整类型

答:

这句话的意思是,现在只能找到:

struct personArray;

找不到:

struct personArray

{

    // .......

};

你找到哪个头文件里有

struct personArray

{

    // .......

};

再include这个头文件就行。

回答问题 2021.01.11

C++函数模板定义两个通用模板时出错

答:

错了很多地方:

1.  max和min有重名;

2. min前没加template T

3. 没有指明模板类型

回答问题 2021.01.11
加载更多