不使用sizeof(),判断当前系统是16位或者32位

本文探讨了如何在不使用`sizeof()`的情况下,通过构造函数中的`this`指针来判断系统是16位还是32位。尽管在构造函数中使用`this`指针需要注意一些限制,例如不能调用被派生类重定义的虚函数,但在适当情况下,可以利用`this`指针访问已初始化的数据成员,实现对象间的协作配置。
摘要由CSDN通过智能技术生成

不使用sizeof(),判断当前系统是16位或者32位

#include <iostream>

int main(int argc,char* agrv[])
{
	int* p = NULL;

	int* pNext = p + 1;

	int res = (int)pNext;

	int nSystemBit = res<<3;

	std::cout<<nSystemBit<<std::endl;

	int i = 65536;
	std::cout << i; // 输出0;//装不下,最高位溢出,剩下16位的当然是0;
	i = 65535;
	std::cout << i; // 输出-1;//-1的补码是65535
}

构造函数中的this指针

-------------------------------原理-------------------------------

某些人认为不应该在构造函数中使用this指针,因为这时this对象还没有完全形成。

但是,只要小心,是可以在构造函数中使用this指针的:

●在函数体中

●初始化列表中

因为“对象还没有完全形成”不意味着“什么都没有”。

在进入构造函数(及其chaining)之前,Compiler会:

●给class的instance分配内存

●建立运行时刻系统所需的信息(如vtbl等)

●##缺省地## 构造所有类成员

 
-----------------------------【能】---------------------------------1.class CMyWindow : public CWnd2.{ 3.private:4.

在C语言中,直接获取计算机的物理内存信息通常是系统级别的操作,不是标准库提供的功能。然而,你可以使用一些特定于平台的API或者第三方库来实现这个功能,例如在Windows平台上可以使用`Windows API`中的`GlobalMemoryStatusEx`函数,而在Linux或Unix-like系统上可以使用`/proc/meminfo`文件。 这里提供一个基本的Windows示例,使用Win32 API,但请注意这需要编译为Windows可执行文件: ```c #include <windows.h> #include <stdio.h> void GetSystemMemoryInfo() { MEMORYSTATUSEX memStat; memStat.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&memStat); DWORD availableMB = memStat.ullAvailPhys / (1024 * 1024); // MB printf("Available physical memory: %.1f MB\n", availableMB); } int main() { if (GetSystemMemoryInfo()) { return 0; } else { printf("Failed to get system memory information.\n"); return 1; } } ``` 在Linux或Unix-like系统上,你需要读取`/proc/meminfo`文件,这通常涉及到I/O和字符串处理,代码会稍微复杂些。下面是一个简化的示例,实际操作可能需要链接到`sys/sysctl.h`或使用类似`libudev`的库: ```c #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/hwinfo.h> // Linux-specific for querying memory int main() { int fd = open("/proc/meminfo", O_RDONLY); if (fd == -1) { perror("Failed to open /proc/meminfo"); return 1; } char buffer[1024]; ssize_t bytes_read = read(fd, buffer, sizeof(buffer)); if (bytes_read <= 0) { perror("Failed to read /proc/meminfo"); close(fd); return 1; } close(fd); // Extract available memory line and convert to MB char* memline = strstr(buffer, "MemFree:"); if (memline) { size_t memfree_idx = memline + strlen("MemFree:"); memline += memfree_idx; // Skip ':' long memfree_in_bytes = strtol(memline, NULL, 10); long availableMB = memfree_in_bytes / (1024 * 1024); printf("Available memory: %.1f MB\n", availableMB); } else { printf("Failed to find MemFree line in /proc/meminfo.\n"); } } ``` 这些代码示例都需要编译时链接到对应的库,并且在实际环境中可能需要处理异常情况。由于跨平台支持的复杂性,如果你在生产环境中使用,可能需要封装成更健壮的库函数或者使用第三方库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值