相关疑难解决方法(0)

std :: vector元素是否保证是连续的?

我的问题很简单: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++ standards vector

104
推荐指数
4
解决办法
4万
查看次数

如何将虚拟内存地址转换为物理地址?

在我的C++程序中(在Windows上),我正在分配一块内存,并确保它在物理内存中保持锁定(未连接和连续)(即使用VirtualAllocEx(),MapUserPhysicalPages()等).

在我的过程中,我可以获得该块的VIRTUAL内存地址, 但我需要找出它的PHYSICAL内存地址,以便将其传递给某个外部设备.


1.在USER模式下,有什么方法可以将虚拟地址转换为程序中的物理地址吗?

2.如果没有,我只能在KERNEL模式下找到这个虚拟到物理映射.我想这意味着我必须写一个驱动程序才能做到这一点......?你知道我可以使用的任何现成的驱动程序/ DLL/API,我的应用程序(程序)将与之交互以进行翻译吗?

3.如果我必须自己编写驱动程序,我该如何进行翻译?我使用哪些功能?是mmGetPhysicalAddress()吗?我该如何使用它?

4.此外,如果我理解正确,mmGetPhysicalAddress()将返回调用进程上下文中的虚拟基址的物理地址.但是如果调用进程是驱动程序,并且我正在使用我的应用程序来调用该函数的驱动程序,那么我正在改变上下文,当调用mmGetPhysicalAddress例程时,我不再处于应用程序的上下文中...所以如何翻译应用程序(用户模式)内存空间中的虚拟地址,而不是驱动程序?

任何答案,提示和代码摘录将不胜感激!

谢谢

c++ memory windows virtual-address-space

19
推荐指数
4
解决办法
2万
查看次数

来自用户空间的连续物理内存

有没有办法从linux中的用户空间分配连续的物理内存?至少几个保证连续的内存页面.一个巨大的页面不是答案.

linux memory

18
推荐指数
2
解决办法
1万
查看次数

如何从Linux内核模块中的逻辑地址获取物理地址?

除了手动浏览页面目录条目外,有没有合适的方法来获取逻辑地址的物理地址?我在内核的源代码中寻找了这个功能,并发现有一个follow_page功能可以很好地利用内置的巨大且透明的大页面支持.但是它没有导出到内核模块(为什么???)......

因此,我不想发明轮子,我认为follow_page手动重新实现功能并不是很好.

linux memory-management linux-kernel

9
推荐指数
1
解决办法
2万
查看次数

数组在*物理*内存中是连续的吗?

我知道数组元素在虚拟内存中肯定是连续的,但是它们在物理内存方面是这样的吗?

#define N 100*1024*1024
int arr[N];
Run Code Online (Sandbox Code Playgroud)

请注意,到目前为止,你们中的大多数人都说答案是否定的,但我的主要问题仍然是下面以粗体显示的问题。


如果没有,至少如果在页面中找到一个元素,那么我是否可以假设整个页面都填充了数组元素(换句话说,它们可能不是在不同页面中连续的,而是在每个单页中连续的,从而提高性能读取 1 个元素,我们读取附近元素的整页,即 4096 字节,而不是读取下一个元素的另一页)?

如果是,如果我尝试分配一个没有可用连续物理内存的大数组怎么办(我相信这可能会发生很多)?

如果答案取决于我对 C 和 C++ 感兴趣的编程语言,如果它取决于我对 linux 感兴趣的操作系统及其变体,例如 ubuntu

c c++ memory arrays memory-management

6
推荐指数
1
解决办法
403
查看次数