首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++的一些小小疑点,请问上大家

2012-09-04 
C++的一些小小问题,请教下大家。第一个问题:字符串和内存char a[]bcd这样的bcd会存储在哪儿?a会存储

C++的一些小小问题,请教下大家。
第一个问题:字符串和内存

  char a[]="bcd";
  这样的"bcd"会存储在哪儿?
  a会存储在哪儿?
  
  如果再运行一个a[]="abc";
  那么"bcd"存储的地方,会不会就因为没有变量指向它们,而导致内存泄漏呢?

  char* b=new char[100];
  这样,b是一个指针的形式存储在哪儿? 
  它的内容是在堆区?是连续存放的吗?

第二个问题:
  昨天在某个视频(孙鑫)中看到这么一句话,每一个新创建的进程,系统都会分配4GB,也就是2的32次方的内存空间。
  请问这个空间,是什么意思,我的内存一共才2G。
  虚拟内存也就1.7G。
  还有,1G=1024M 1M=1024K 1K=1024B。
  经过计算 2的32次方 为 4294927296。
  4*1024*1024*1024=34959738368
  
第三个问题
  如果我编写一个类,如果里面什么都没有,sizeof()之,会提示有多大呢。由于现在在外面,没电脑,不好意思。
  是4吗?
  如果里面有数据成员,会有多大。
  class A{classB(classC(classD))}这样,大小为A+B+C+D吗?

第四个问题
  int swap(int& a,int &b)
  {
  a=a+b;
  b=a-b;
  a=a-b;
  }
  int swap 这些东西会存放在哪儿呢?

  sizeof(swap)能够得出函数的大小吗?

[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

[解决办法]
第一个问题,看看这篇http://blog.csdn.net/hairetz/article/details/4141043
第二个。1024是2的10次方。3个1024相乘是2的30次方。2的平方是4.我没算你那些,你自己再算算。
第三个:sizeof空类,大小是1.
第四个:不知道。
[解决办法]
第四个问题,在C语言中int swap(){}表示对函数的定义;
到汇编(最接近机器指令了)中就是这个函数入口地址,调用这个函数的时候汇编指令是 call xxx;

其他程序段调用这个子过程,只需要知道子程序地址入口就可以了。
[解决办法]
1. 字符串常量都会编译进 exe 文件的数据段里面, 程序启动的时候自动映射到内存里面. 不存在内存泄露的问题. 如果这是在一个函数里面, a 存储在线程的运行栈里面. 如果是一个全局变量, a 也在数据段里面.
b 也一样, 如果是在函数里, b 存储在栈里面, 如果是全局, 在数据段里, b 指向的内存是在堆里. 内存连续? 同一次 new 的内存当然必须是连续的. 但是存放 b 的内存和 b 指向的内存肯定不连续.

2. 这个 4G 是地址空间, 即不是物理内存, 也不是虚拟内存. 也就是你的指针的范围, 0X00000000 ~ 0XFFFFFFFF, 一个 unsigned int 的大小.

3. 是 1.
不是简单的相加, 还需要考虑对齐, 比如:
class A{ char c;};
class B{ int x;};
class C { A a; B b; };
sizeof(A) = 1, sizeof(B) = 4, sizeof(C) = 8

4. 编译成了机器码, 放在代码段里面. swap 被认为是指向这段代码的首地址, 即函数指针 sizeof(swap) 是一个指针的大小 4
[解决办法]
第一个问题:

C/C++ code
#include <iostream>using namespace std;int main(int argc, char** argv){    char a[] = "abc";    // "abc"存放在栈上    char b[] = "abc";    cout << (void*)a << endl;    cout << (void*)b << endl;    char* pa = "abc";    // "abc"存放在常量区    char* pb = "abc";        cout << (void*)pa << endl;    cout << (void*)pb << endl;    char* pc = new char[100];    // pc本身存放在栈上,但其所指的内容存放在堆上。                    // 其所指的内容是连续的。    return 0;} 

热点排行