高分求解,关于C++内存地址的问题,不理解!

kosora曹 2014-02-21 12:28:15

#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
class People{
public:
int id;
int age;
};
int main(int argc, char **argv) {
People p1;
People *p2=new People();
People p3;
string str1="Hello";
char *str2=new char(6);
printf("%d %d %d\n",&p1,p2,&p3);
printf("%d %d\n",sizeof(p1),sizeof(p2));
printf("%d %d\n",&str1,str2);
printf("%d %d\n",sizeof(str1),sizeof(str2));
return 0;
}


结果:

初步的理解是:
1、大小:p2、str2是unsigned类型的指针,所以大小为4,存在于栈中,但他们所指向的连续内存存在于堆中;p1、str1是真正的对象,所以大小等于所包含的field的大小总和,他们是否也存在于栈中,他们所包含的field的内存是否也存在于栈中?
2、地址:输出的&p1、&p3、&str1都是栈内存的地址(由高向低扩展),而p2、str2是堆内存的地址(由低向高扩展);p1、str1是否属于引用类型,还是指针类型?
最好能画个内存结构图给我,高分献上!!!
...全文
196 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
逍__遥 2014-02-21
  • 打赏
  • 举报
回复
最后一行打印sizeof(str1)= 16???为什么??,不应该是4吗
vipcxj 2014-02-21
  • 打赏
  • 举报
回复
引用 7 楼 SmallYamateh 的回复:
[quote=引用 6 楼 vipcxj 的回复:] [quote=引用 3 楼 SmallYamateh 的回复:] [quote=引用 2 楼 xiaohuh421 的回复:] 你的str1是对象, 所以sizeof求的就是对象的大小. 对于1. p1、str1是真正的对象,所以大小等于所包含的field的大小总和,他们是否也存在于栈中,他们所包含的field的内存是否也存在于栈中? field内存在你的代码中是在栈上的, 但是内部保存串的指针就不定是了. 2.p1、str1是否属于引用类型,还是指针类型? p1,str1都是对象, 不是引用也不是指针.
p1对象在栈中所占用的内存是否是id、age内存的和8?[/quote] p1对象在我能想到的绝大多数编译器上都是8,这个this指针毫无关系,事实上,类的大小里就不包含this指针,this指针貌似是语法的概念。不过复杂的类所占空间可能包含虚表,还有基类,还有基类的虚表。但LZ所写的类是最简单的POD类型,不考虑内存对齐,大小就是俩int。考虑了内存对齐,大小还是俩int。[/quote] 实际开发中,关于“新建对象”这个代码风格,倾向于p1的写法还是p2的写法呢?[/quote] 这的看实际情况,一个是堆上的,一个是栈上的。一般来说能放在栈上的当然放在栈上喽,这样不怕内存泄露,而且申请内存的效率远高于new。但现实中总有这样那样的理由,不能放在栈上。 1.栈上的对象生命周期是定死的,出了作用域就没了。正所谓很多时候长处也是短处。 2.栈的空间有限,一般也就几M,稍微分配大点的空间就可以溢出了。 暂时就想到上面俩问题,估计还有其他的原因使得有时候必须new对象。
kosora曹 2014-02-21
  • 打赏
  • 举报
回复
引用 6 楼 vipcxj 的回复:
[quote=引用 3 楼 SmallYamateh 的回复:] [quote=引用 2 楼 xiaohuh421 的回复:] 你的str1是对象, 所以sizeof求的就是对象的大小. 对于1. p1、str1是真正的对象,所以大小等于所包含的field的大小总和,他们是否也存在于栈中,他们所包含的field的内存是否也存在于栈中? field内存在你的代码中是在栈上的, 但是内部保存串的指针就不定是了. 2.p1、str1是否属于引用类型,还是指针类型? p1,str1都是对象, 不是引用也不是指针.
p1对象在栈中所占用的内存是否是id、age内存的和8?[/quote] p1对象在我能想到的绝大多数编译器上都是8,这个this指针毫无关系,事实上,类的大小里就不包含this指针,this指针貌似是语法的概念。不过复杂的类所占空间可能包含虚表,还有基类,还有基类的虚表。但LZ所写的类是最简单的POD类型,不考虑内存对齐,大小就是俩int。考虑了内存对齐,大小还是俩int。[/quote] 实际开发中,关于“新建对象”这个代码风格,倾向于p1的写法还是p2的写法呢?
vipcxj 2014-02-21
  • 打赏
  • 举报
回复
引用 3 楼 SmallYamateh 的回复:
[quote=引用 2 楼 xiaohuh421 的回复:] 你的str1是对象, 所以sizeof求的就是对象的大小. 对于1. p1、str1是真正的对象,所以大小等于所包含的field的大小总和,他们是否也存在于栈中,他们所包含的field的内存是否也存在于栈中? field内存在你的代码中是在栈上的, 但是内部保存串的指针就不定是了. 2.p1、str1是否属于引用类型,还是指针类型? p1,str1都是对象, 不是引用也不是指针.
p1对象在栈中所占用的内存是否是id、age内存的和8?[/quote] p1对象在我能想到的绝大多数编译器上都是8,这个this指针毫无关系,事实上,类的大小里就不包含this指针,this指针貌似是语法的概念。不过复杂的类所占空间可能包含虚表,还有基类,还有基类的虚表。但LZ所写的类是最简单的POD类型,不考虑内存对齐,大小就是俩int。考虑了内存对齐,大小还是俩int。
赵4老师 2014-02-21
  • 打赏
  • 举报
回复
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
xiaohuh421 2014-02-21
  • 打赏
  • 举报
回复
p1对像具体是多少应该是取决于编译器. 并不一定正好是成员占用空间相加. 可能有this指针,或者其它东西.
kosora曹 2014-02-21
  • 打赏
  • 举报
回复
引用 2 楼 xiaohuh421 的回复:
你的str1是对象, 所以sizeof求的就是对象的大小. 对于1. p1、str1是真正的对象,所以大小等于所包含的field的大小总和,他们是否也存在于栈中,他们所包含的field的内存是否也存在于栈中? field内存在你的代码中是在栈上的, 但是内部保存串的指针就不定是了. 2.p1、str1是否属于引用类型,还是指针类型? p1,str1都是对象, 不是引用也不是指针.
p1对象在栈中所占用的内存是否是id、age内存的和8?
xiaohuh421 2014-02-21
  • 打赏
  • 举报
回复
你的str1是对象, 所以sizeof求的就是对象的大小. 对于1. p1、str1是真正的对象,所以大小等于所包含的field的大小总和,他们是否也存在于栈中,他们所包含的field的内存是否也存在于栈中? field内存在你的代码中是在栈上的, 但是内部保存串的指针就不定是了. 2.p1、str1是否属于引用类型,还是指针类型? p1,str1都是对象, 不是引用也不是指针.
mujiok2003 2014-02-21
  • 打赏
  • 举报
回复
vc 2010加选项/d1reportSingleClassLayoutTheString
#include <string>
#include <cstdio>
class TheString : std::string
{
};

class People{
public:
	int id;
	int age;
};
int main(int argc, char **argv)
{
	People p1;
	People *p2=new People();
	People p3;
	std::string str1="Hello";
	char *str2=new char(6);
	printf("%p %p %p\n",&p1,&p2,&p3);
	printf("%d %d\n",sizeof(p1),sizeof(p2));
	printf("%p %p\n",&str1,&str2);
	printf("%d %d\n",sizeof(str1),sizeof(str2));
	return 0;
}
debug编译输出
ClCompile:
1>  demo.cpp
1>  class TheString	size(32):
1>  	+---
1>  	| +--- (base class ?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@)
1>  	| | +--- (base class ?$_String_val@DV?$allocator@D@std@@)
1>  	| | | +--- (base class _Container_base12)
1>   0	| | | | _Myproxy
1>  	| | | +---
1>   4	| | | _Bxty _Bx
1>  20	| | | _Mysize
1>  24	| | | _Myres
1>  28	| | | ?$allocator@D _Alval
1>    	| | | <alignment member> (size=3)
1>  	| | +---
1>  	| +---
1>  	+---
1>  
1>  
1>  
1>Manifest:
1>  Deleting file "Debug\demo.exe.embed.manifest".
运行输出:
0027FDCC 0027FDC0 0027FDB0
8 4
0027FD88 0027FD7C
32 4
请按任意键继续. . .
目录 第一章 从零开始 8 1.1机试分析 8 1.2 IDE的选择与评测结果 10 1.3 DreamJudge的使用 11 1.4输入输出技巧 12 1.5头文件技巧 15 1.6数组使用技巧 16 1.7审时度势 — 复杂度与是否可做 19 1.8 C++ STL的使用 21 1.9多组输入的问题 27 第二章 入门经典 29 2.1 简单模拟 30 2.2 进制转换类问题 32 2.3 排版类问题 37 2.4 日期类问题 42 2.5 字符串类问题 45 2.6 排序类问题 47 2.7 查找类问题 54 2.8 贪心类问题 61 2.9 链表类问题 65 第三章 数学 68 3.1 同模余定理 69 3.2 最大公约数(GCD) 72 3.3 最小公倍数(LCM) 74 3.4 斐波那契数列 75 3.5 素数判定 76 3.6 素数筛选 78 3.7 分解素因数 81 3.8 二分快速幂 83 3.9 常见数学公式总结 85 3.10 规律神器OEIS 87 第四章 高精度问题 89 4.1 Python解法 90 4.2 Java解法 91 4.3 C/C++解法 92 第五章 数据结构 93 5.1 栈的应用 94 5.2 哈夫曼树 96 5.3 二叉树 102 5.4 二叉排序树 111 5.5 hash算法 114 5.6 前缀树 115 第六章 搜索 121 6.1 暴力枚举 122 6.2 广度优先搜索(BFS) 124 6.3 递归及其应用 127 6.4 深度优先搜索(DFS) 130 6.5 搜索剪枝技巧 135 6.6 终极骗分技巧 138 第七章 图论 139 7.1 理论基础 140 7.2 图的存储 145 7.3 并查集 148 7.4 最小生成树问题 151 7.5 最短路径问题 155 7.6 拓扑排序 162 第八章 动态规划 165 8.1 递推求解 166 8.2 最大子段和 168 8.3 最长上升子序列(LIS) 170 8.4 最长公共子序列(LCS) 174 8.5 背包类问题 176 8.6 记忆化搜索 179 8.7 字符串相关的动态规划 182

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧