c++ 栈:
内存分配中一个区域 --- 栈区
栈区大小
栈区分配:
操作系统自动分配,按照定义的变量大小地址由高到低的分配空间
{
int arr[4];
int arrb[4]
}
这里arr 的地址比arrb的地址值大,系统对栈的分配是由高地址向低地址进行分配的操作
arr[0], arr[1],arr[2],arr[3]每一个变量的地址arr[0] 最小, arr[4]最大
或者
arr[0], arr[1],arr[2],arr[3]每一个变量的地址arr[4] 最小, arr[0]最大
这个可以判断系统是大端模式还是小端模式
计算机存储模式按照字节或者字的方式进行存储,对于一块连续的内存
01
02
03
04
0x12345678
按照字节存储的方式 0x12 , 0x34, 0x56, 0x78,(高数据位0x12,低数据位0x78)
内存假想的01地址是存放0x12,还是存放0x78 的值,就是大端。(01 为低地址,04为高地址)
如何在代码判断大小端
int i = 100;
64 00 00 00
i& 0xFF000000 结构为非零值则为大端
>> 操作
右移操作 1位相当于 除以 2,这个操作相当注意被操作数的类型。例如:
int main()
{
int i = -1;
while (i)
{
i = i >> 1;
printf("i : %d \t", i);
}
return 0;
}
该段代码会陷入死循环,相关知识点是c++ 移位后最高位补位的问题。
int 类型最高位为符号位,正数最高位为0,负数最高位为-1
reinterpret_cast, static_cast
一直以为reinterpret_cast是完全按照字节赋值的
1. 类型转换unsigned short 与 wchar_t同样是两个字节,却报了编译错误
2. static_cast没有动态类型检查,能通过编译
问题疑点: reinterpret_cast 转化的对象只能是指针,static_cast 可以是类型也可以是指针
abort 中断机制
资源不会被释放
strlen 函数针对没有\0结尾的字符
const char cp = '\0'; -- 0
const char cp = 'a'; -- 10
len = strlen(&cp);
strlen 返回 char* 指向的字符缓冲区的开始到0为止的字符
std::map
简单记录一下std::map函数问题
std::map 是一棵红黑树的数据结构,记录的信息比较多都是需要allocate内存
使用场景:std::map 作为类(或者结构体的成员)
例子如下:
struct A
{
std::map<std::string, void*> mMap;
};
int main()
{
vector<int> range;
for (int i = 0; i < 10; i++)
{
range.push_back(i);
}
for (auto element : range)
{
cout << element << " ";
}
cout << endl;
A* a;
//struct A 对象使用了指针,并且没有进行初始化,导致std:;map 函数没有被调用到,
最终的结构就是std::map 在find 函数里面没有进行判断,导致程序的崩溃
a->mMap.find("aaa");
return 0;
}
这段代码的问题在std::map find 函数
template <class _Keyty>
_Tree_find_result<_Nodeptr> _Find_lower_bound(const _Keyty& _Keyval) const {
const auto _Scary = _Get_scary();
// 这个地方Scary 复杂的数据结构没有进行判断是否是合法的内存,直接调用_Scary->Myhead 导致了内存的崩溃
_Tree_find_result<_Nodeptr> _Result{{_Scary->_Myhead->_Parent, _Tree_child::_Right}, _Scary->_Myhead};
_Nodeptr _Trynode = _Result._Location._Parent;
while (!_Trynode->_Isnil) {
_Result._Location._Parent = _Trynode;
if (_DEBUG_LT_PRED(_Getcomp(), _Traits::_Kfn(_Trynode->_Myval), _Keyval)) {
_Result._Location._Child = _Tree_child::_Right;
_Trynode = _Trynode->_Right;
} else {
_Result._Location._Child = _Tree_child::_Left;
_Result._Bound = _Trynode;
_Trynode = _Trynode->_Left;
}
}
return _Result;
}
Tools
Visual studio 2010
虽然很不喜欢Visual studio 2010,无奈使用,不得不说visual studio 是大学入门级的代码编译软件,它差点让我放弃了学习代码,因为它的实力臃肿,配置之复杂,记得大学老师说visual studio不好用,现在是深有体会。
一个小小的main函数,需要建立一个工程项目
6个文件夹,29个文件,20.9MB 的大小,数都数不出来的字节个数
目的是什么:visual studio 继承了太多的语言,快捷方式,调试信息(本身的产品调试),debug信息(写的代码的跟踪调试)等等为你好的功能,有种冷叫妈妈觉得你冷的感觉。
6个文件夹:每个文件夹下面提供了一些功能,也提供了对应的GUI 界面让你灵活配置,百年难碰的,而且这些文件不对自动地修改,当你对visual studio的核心文件进行了添加,修改,删除后,90%的机会要亲自去生成对应的配置文件,不然可能又意想不到的功能不能正常使用,而你最大的打愿望就是期望,剩下的几十亿同胞有和你出现过一样问题的人出现,不然你就得去找官方文档,然后各种尝试,每一步都谨小慎微,一步不对,满盘皆输,还会越来越混乱,你居然会为了那些凑巧解决问题了而欢呼雀跃。
解决方案文件夹
*.sln:这个文件一看就让人赏心悦目,一下就是有组织有架构,一目了然
Project
EndProject
Global
GlobalSection
EndGlobalSection
EndGlobal
ipch: 二进制文件,难度,晦涩