作者UNARYvvv (有趣生活)
看板C_and_CPP
标题Re: [问题] 关於C++分配记忆体的问题?
时间Sun May 7 01:01:38 2006
※ 引述《pikachu123 (pika)》之铭言:
: 请问各位高手~~~~~~~~~~~~
: 就是阿C++宣告了一个整数变数
: 例如:int a;
: 这时候系统不是就会分配记忆体给a~~~
: 我想问说可以步让让系统分配记体体位置~~~
: 我自己来分配特定空间给它~~~~
: C++做得到吗~~~
: 问了个奇怪的问题@@
如同 yoco 所说的,C++ 本身并不提供这一个层次的能力
如果你想动态配置一块记忆体
并希望这块记忆体,配在你自己订定的位址上
光用 malloc 没有办法做到
因为 malloc 根本就没有提供「自订配置区块起始位址」的参数
至於 OS 提供的 API 可能就会有提供这个功能 (或类似)
例如 Win32 API "VirtualAlloc",这 API 的细节可查 MSDN
VirtualAlloc 主要可以自己配置 virtual memory page
配置出来的记忆体起始位址,可由系统自动判定,或者自行"建议"
如果自行建议的位址已经被配置给其他区块
或者该位址不能被存取
(例如 user mode 程式要直接配置到 system address space)
则 VirtualAlloc 就会失败
刚才写了一小段程式
功能是尝试配置 4096 bytes 到 0x400000 和 0x700000 这两个位址上
参考一下,看看这对你程式的需求有没有帮助罗~
#include <windows.h>
#include <stdio.h>
void TestAlloc(PVOID expectedAddr){
PVOID returnedAddr = VirtualAlloc(
expectedAddr,4096,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
printf("Test : %p\n\t",expectedAddr);
if (returnedAddr == expectedAddr){
sprintf((PSTR)returnedAddr,"returnedAddr == %p",returnedAddr);
puts((PSTR)returnedAddr);
VirtualFree(returnedAddr,4096,MEM_FREE);
}else
printf("failed to allocate a page at %p, GLE=%d\n",
expectedAddr,GetLastError());
}
int main(){
TestAlloc((PVOID)0x400000);
TestAlloc((PVOID)0x700000);
return 0;
}
===================
在我电脑跑的 output
===================
Test : 00400000
failed to allocate a page at 00400000, GLE=487
Test : 00700000
returnedAddr == 00700000
-------------------------------------------------------
试 0x400000 本来就是有很大的机率会失败
因为多数 process 会把执行档 map 到这个位址
这个自己写的测试程式应该也是
(还有例如 MSN - msnmsgr.exe;PCMan - PCMan.exe)
配到 0x700000 的话
如果该位址上还没有被使用,基本上就可以配置成功
不过你也可能测出来失败,原因的话查那个 GetLastError() 回传值就可以了
总之可以自己改改看,实验一下罗~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.70.137.117
※ 编辑: UNARYvvv 来自: 61.70.137.117 (05/07 01:02)
1F:推 pikachu123:想问一下那LINUX上呢@@? 05/07 06:43