gpt4 book ai didi

c++ - 是否有编译器标志让 malloc 返回超过 4G 限制的指针以进行 64 位测试(各种平台)?

转载 作者:太空狗 更新时间:2023-10-29 20:19:14 24 4
gpt4 key购买 nike

我需要测试从 32 位移植到 64 位的代码,其中指针被转换为整数句柄,我必须确保在 64 位平台上使用正确大小的类型。

是否有针对各种编译器的标志,甚至运行时的标志,以确保 malloc 返回大于 32 位限制的指针值?

我感兴趣的平台:

  1. Windows XP 64 和其他 64 位 Windows 上的 Visual Studio 2008
  2. 使用 xLC 的 AIX
  3. 64 位 gcc
  4. 使用 aCC 的 64 位 HP/UX

分配 4GB 的示例应用程序

感谢 R Samuel Klatchko 的回答,我能够实现一个简单的测试应用程序,该应用程序将尝试在前 4GB 地址空间中分配页面。希望这对其他人有用,并且其他 SO 用户可以让我了解它的可移植性/有效性。

#include <stdlib.h>
#include <stdio.h>
#define UINT_32_MAX 0xFFFFFFFF

#ifdef WIN32
typedef unsigned __int64 Tuint64;
#include <windows.h>
#else
typedef unsigned long long Tuint64;
#include <sys/mman.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#endif

static void* Allocate(void* pSuggested, unsigned int PageSize)
{
#ifdef WIN32
void* pAllocated = ::VirtualAlloc(pSuggested, PageSize, MEM_RESERVE ,PAGE_NOACCESS);
if (pAllocated)
{
return pAllocated;
}
return (void*)-1;
#else
void* pAllocated = ::mmap(pSuggested,
PageSize,
PROT_NONE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE,
-1,
0);
if (pAllocated == MAP_FAILED)
{
pAllocated = (void*)-1;
}
return pAllocated;
#endif
}

static void Deallocate(void* pRegion, unsigned int PageSize)
{
#ifdef WIN32
::VirtualFree(pRegion,0,MEM_RELEASE);
#else
::munmap(pRegion,PageSize);
#endif
}

static void Gobble32bitAddressSpace()
{
#ifdef WIN32
SYSTEM_INFO SysInfo;
::GetSystemInfo(&SysInfo);
unsigned int PageSize = SysInfo.dwAllocationGranularity;
#else
unsigned int PageSize = ::sysconf(_SC_PAGE_SIZE);
#endif

unsigned int AllocatedPages = 0;
unsigned int SkippedPages = 0;
void *pStart = 0;
while( ((Tuint64)pStart) < UINT_32_MAX)
{
void* pAllocated = Allocate(pStart, PageSize);
if (pAllocated != (void*)-1)
{
if (pAllocated == pStart)
{
//Allocated at expected location
AllocatedPages++;
}
else
{
//Allocated at a different location
//unallocate and consider this page unreserved
SkippedPages++;
Deallocate(pAllocated,PageSize);
}
}
else
{
//could not allocate at all
SkippedPages++;
}
pStart = (char*)pStart + PageSize;
}
printf("PageSize : %u\n",PageSize);
printf("Allocated Pages : %u (%u bytes)\n",AllocatedPages,PageSize*AllocatedPages);
printf("Skipped Pages : %u (%u bytes)\n",SkippedPages,SkippedPages*PageSize);
}

int main()
{
Gobble32bitAddressSpace();

//Try to call malloc now and see if we get an
//address above 4GB
void* pFirstMalloc = ::malloc(1024);
if (((Tuint64)pFirstMalloc) >= UINT_32_MAX)
{
printf("OK\n");
}
else
{
printf("FAIL\n");
}
return 0;
}

最佳答案

我过去使用的一种技术是在启动时分配足够的内存,以便用完所有低于 4GB 限制的地址空间。虽然此技术确实依赖于 malloc 首先使用地址空间的较低部分,但在我工作的所有平台(Linux、Solaris 和 Windows)上都是如此。

由于 Linux 使用过量使用的方式,如果分配的空间不低于 4GB 限制,就不会用完任何虚拟内存。

在 Windows 上,您可以使用带有 MEM_RESERVE 标志的 VirtualAlloc() 来用完地址空间而不分配任何实际存储空间。

关于c++ - 是否有编译器标志让 malloc 返回超过 4G 限制的指针以进行 64 位测试(各种平台)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1772672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com