请选择 进入手机版 | 继续访问电脑版

C++编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: ID紫麒麟

紫麒麟笔记_对一些基础东西的理解

[复制链接]

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-1 12:48:02 | 显示全部楼层
在 windows 等平台上,不同线程缺省使用同一个堆,所以用 C 的 malloc (或者 windows 的 GlobalAlloc)分配内存的时候是使用了同步保护的。如果没有同步保护,在两个线程同时执行内存操作的时候会产生竞争条件,可能导致堆内内存管理混乱。比如两个线程分配了统一块内存地址,空闲链表指针错误等。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-9 16:57:30 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2017-6-9 16:59 编辑

有符号和无符号的东西,还有左移右移操作符,到底会补充什么,是0还是1?有时候不一定,特别是不同的编译器补充有时候就是不一样的。
这个在编码的时候有时候会碰到。

还有两个char相加,会变成short或者int。。。。这些都是细节,但是如果发生
char a;
char b;
const char c = 0xaa;
if (c == a+b) {
    //这里面的代码会不会永远都不执行?
}
不同的编译器处理可能会不一样。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-15 15:25:03 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2017-6-15 15:39 编辑

今天再来说说NULL、nullptr、0这三个东西吧。
我的理解:1、一般写纯c的代码的时候记得用NULL;
2、一般写c++的指针赋值的时候用nullptr,遇到低版本的时候识别不了nullptr的时候,写一句#define nullptr NULL就好了。
3、至于0这个东西,是给变量赋值的东西,不是给指针赋值的,但是有时候确实也会出现用0来给指针赋值的情况。

附注:
针对上面的1来说,纯c的代码用NULL是因为nullptr是c++的东西;
针对2来说,既然写的是c++的,所以要用c++的,实际上c++引入nullptr是有原因的,nullptr就是一种特殊的指针,也是一种类型。
针对3来说,有时候初始化一个结构体,我们经常用的就是memset一下,如果结构体中有指针的时候,不就是相当于给一个指针赋0值了么。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-16 17:42:41 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2017-6-16 17:50 编辑

自旋锁、互斥锁
这两个东西,可能最先接触的都是互斥锁。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-20 18:43:05 | 显示全部楼层
今天有点儿犯懒,随便写个东西吧。
SendMessage
PostMessage
PeekMessage
上面这三个东西都是啥?可以看看,windows下消息机制。。。。。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-22 10:32:39 | 显示全部楼层
编译时多态
运行时多态

其实C语言也可以实现多态。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-22 16:49:05 | 显示全部楼层
字符串转换成数字的方法,思路如下:
字符减去'0',然后乘以进制,
字符减去'a'/'A',然后乘以进制(移位)
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-22 18:19:11 | 显示全部楼层
写一下关于嬴政的《C++类构造函数初始化列表执行顺序》
http://c.panshy.com/thread-27-1-1.html
这个文章的东西,今天在另外一个群里面看到有人问这个问题,发现g++与VS的初始化顺序是相反的。
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-23 22:01:04 | 显示全部楼层
本帖最后由 ID紫麒麟 于 2017-6-25 16:34 编辑

在VS版本里面写这样一个代码:
#include <stdio.h>
int main(int argc, char* argv[])
{
    char * p = NULL;
    p = new char[0x3fffffff];
    printf("%p\n", p);
    p = new char[0x4fffffff];
    printf("%p\n", p);
    getchar();
    return 0;
}


运行结果:



我感觉上面的没什么问题,提出这个问题的人说是看new有没有抛出异常。
我可能没有get到提问题人的点吧。
我又试了一下下面的这个代码:
    char * p = NULL;
    p = new char[0x3fffffff];
    printf("%p\n", p);
    delete []p;
    p = new char[0x4fffffff];
    printf("%p\n", p);
    delete []p;
发现两次分配的内存起始地址一样。可能是我用的64位系统,然后笔记本内存也比较大吧。

有人告诉我new和malloc分配内存在存储区域上是有区别的,也有人说是一样的,我找到一个博客:
http://blog.csdn.net/l_xrui/article/details/62886695



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

18

主题

225

帖子

971

积分

高软

Rank: 4

积分
971
 楼主| 发表于 2017-6-25 17:21:05 | 显示全部楼层
找到一个详细解释上面的那个问题的博客:
http://www.cnblogs.com/avril/p/3175175.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|C++编程  

GMT+8, 2019-7-22 19:49 , Processed in 0.093750 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表