关于C/C++获取指针大小判断系统位数的猜想
来源:互联网 发布:百度鹰眼轨迹 java 编辑:程序博客网 时间:2024/04/20 19:55
不讨论使用sizeof
第一个程序,指针类型会根据系统位数的大小而分配。
#include <stdio.h>int main(int argc, char *argv[]){int *p = (int *)~0;int count = 0;for (;p!=0;){p = (int *)((long)p << 1);count++;}printf("%d\n",count);return 0;}
但是这里存在一个问题,将p转换成long,如果在32位的编译期的话,那么long就是32,那么这个结果就是32,不正确,存在精度的损失。
第二个程序,利用结构体,通过计算成员的偏移位置offset确定指针大小。
#include <stdio.h>#define bit(type, mem) ((int)&((type *)0)->mem)struct A{int *p;int a;};int main(int argc, char *argv[]){printf("%d\n", bit(struct A,a)*8);return 0;}
上面,define计算出了偏移位置,如果指针大小和编译器无关,那么结果是真确的。
但其实指针大小跟编译器是有相关,编译器可根据编译选项编译出不同大小的指针,或32或64位。
建议可以深入学习一下《深入理解c指针》,关于用size_t 和 intptr_t的一些判断方法。
另外,linux下的getconf LONG_BIT可以获取系统位数~~~~~~~~~
==================================华丽的分割线========================================
下面是C++ class一些data member layout的讨论,和程序二类似。
#include <iostream>#include <stdio.h>using namespace std;#define bit_cpp(type, mem) (&type::mem)class B{public:int *p;int b;};int main(int argc, char *argv[]){// FIrstprintf("%p\n", bit_cpp(B, b));// Secondcout << &B::p << endl << &B::b << endl;return 0;}
g++编译输出:
①这里用printf输出,对于cout输出type class::*类型指针应是不合法的,可参见《深入探索C++对象模型》p131.
②这里输出了1,而且两个data member都输出了1,估计cout见到指针都慌了!!
③data member layout:
上面程序有个问题就是,printf输出了8,见下面一段程序:
int B::**pp = 0;int B::**pp1 = &B::p;if (pp1 == pp){// do something.}
如果不在data member offset上加上1,那么无法判断指针到底有没有指向data member了,所以在class data member上加1来判断。
但是一些编译器,比如microsoft visual c++ 或许会输出0,因为它内部有一些手脚~~~~
上面cout两个data member 都是1,是cout出了问题,关于什么问题,目前也不清楚了,知道的同学指教一下~~~~
1 0
- 关于C/C++获取指针大小判断系统位数的猜想
- C 如何判断一个数的位数
- 详解C语言判断系统的大小端问题
- [C/C++]_[初级]_[获取Windows系统的位数32位或64位]
- 一个关于四位数猜想的验证
- 关于C的指针
- 关于C指针的一个问题(获取内存)
- C语言*函数调用* 判断输入数字各个位数的和>> 结合判断一个数是几位数
- C语言的指针大小问题
- C语言(指针变量的大小)
- 【C语言】大小端存储的判断
- 【C语言】大小端的判断
- 判断大小端序的C程序
- 【C语言】判断机器的大小端
- 判断机器的大小端 && 和位数
- C的5位数
- 哥德巴赫猜想(c 循环+素数判断)
- 关于C/C++的指针
- Swift - 使用NSURLSession同步获取数据(通过添加信号量)
- 挂载raw和qcow2格式虚拟机启动卷的方法
- 2016.03.15回顾
- Jquery入门详解
- 巧用countif函数排名
- 关于C/C++获取指针大小判断系统位数的猜想
- sftp通过秘钥上传,修改文件
- iOS进阶面试题一
- 利用runtime添加属性
- 详解Android开发中Activity的四种launchMode
- 【LeetCode】153. Find Minimum in Rotated Sorted Array
- pip安装使用详解
- Lab根据内容动态获取宽、高
- 算法系列2、分治算法