我的问题很简单:std :: vector元素是否保证是连续的?在order word中,我可以使用指向std :: vector的第一个元素的指针作为C数组吗?
如果我的记忆力很好,那么C++标准就没有这样的保证.但是,如果元素不连续,那么std :: vector要求几乎不可能满足它们.
有人可以澄清一下吗?
例:
std::vector<int> values;
// ... fill up values
if( !values.empty() )
{
int *array = &values[0];
for( int i = 0; i < values.size(); ++i )
{
int v = array[i];
// do something with 'v'
}
}
Run Code Online (Sandbox Code Playgroud) 在我的C++程序中(在Windows上),我正在分配一块内存,并确保它在物理内存中保持锁定(未连接和连续)(即使用VirtualAllocEx(),MapUserPhysicalPages()等).
在我的过程中,我可以获得该块的VIRTUAL内存地址, 但我需要找出它的PHYSICAL内存地址,以便将其传递给某个外部设备.
1.在USER模式下,有什么方法可以将虚拟地址转换为程序中的物理地址吗?
2.如果没有,我只能在KERNEL模式下找到这个虚拟到物理映射.我想这意味着我必须写一个驱动程序才能做到这一点......?你知道我可以使用的任何现成的驱动程序/ DLL/API,我的应用程序(程序)将与之交互以进行翻译吗?
3.如果我必须自己编写驱动程序,我该如何进行翻译?我使用哪些功能?是mmGetPhysicalAddress()吗?我该如何使用它?
4.此外,如果我理解正确,mmGetPhysicalAddress()将返回调用进程上下文中的虚拟基址的物理地址.但是如果调用进程是驱动程序,并且我正在使用我的应用程序来调用该函数的驱动程序,那么我正在改变上下文,当调用mmGetPhysicalAddress例程时,我不再处于应用程序的上下文中...所以如何翻译应用程序(用户模式)内存空间中的虚拟地址,而不是驱动程序?
任何答案,提示和代码摘录将不胜感激!
谢谢
有没有办法从linux中的用户空间分配连续的物理内存?至少几个保证连续的内存页面.一个巨大的页面不是答案.
除了手动浏览页面目录条目外,有没有合适的方法来获取逻辑地址的物理地址?我在内核的源代码中寻找了这个功能,并发现有一个follow_page功能可以很好地利用内置的巨大且透明的大页面支持.但是它没有导出到内核模块(为什么???)......
因此,我不想发明轮子,我认为follow_page手动重新实现功能并不是很好.
我知道数组元素在虚拟内存中肯定是连续的,但是它们在物理内存方面是这样的吗?
#define N 100*1024*1024
int arr[N];
Run Code Online (Sandbox Code Playgroud)
请注意,到目前为止,你们中的大多数人都说答案是否定的,但我的主要问题仍然是下面以粗体显示的问题。
如果没有,至少如果在页面中找到一个元素,那么我是否可以假设整个页面都填充了数组元素(换句话说,它们可能不是在不同页面中连续的,而是在每个单页中连续的,从而提高性能读取 1 个元素,我们读取附近元素的整页,即 4096 字节,而不是读取下一个元素的另一页)?
如果是,如果我尝试分配一个没有可用连续物理内存的大数组怎么办(我相信这可能会发生很多)?
如果答案取决于我对 C 和 C++ 感兴趣的编程语言,如果它取决于我对 linux 感兴趣的操作系统及其变体,例如 ubuntu