Tag: 内存

struct function的不兼容返回类型 – C.

当我尝试按原样运行此代码时,我收到编译器消息“错误:返回不兼容的类型”。 我在代码中标记了错误的位置。 如果我把这条线拿出来,那么编译器很高兴。 问题是我想返回一个表示函数无效输入的值(在这种情况下调用f2(2)。)我只想要一个返回数据的结构,如果调用该函数而不使用2作为参数。 我觉得只有两种方法可以: 使函数返回一个结构指针而不是一个死对象结构但是我的调用函数看起来很有趣,因为我必须将yb更改为y-> b,并且由于在内存中获取数据的额外步骤,操作可能会更慢。 分配额外的内存,零字节填充它,并将返回值设置为内存中该位置的结构。 (例如: return x[nnn];而不是return x[0]; )。 这种方法将使用更多的内存和一些处理来零字节填充它。 最终,我正在寻找一种从长远来看最快,最干净(在代码方面)的解决方案。 如果我不得不坚持使用->来解决元素的成员,那么我想这就是要走的路。 有没有人有一个使用最少的CPU功率的解决方案? #include #include #include typedef struct{ long a; char b; }ab; static char dat[500]; ab f2(int set){ ab* x=(ab*)dat; if (set==2){return NULL;} if (set==1){ x->a=1; x->b=’1′; x++; x->a=2; x->b=’2′; x=(ab*)dat; } return x[0]; } int main(){ ab y; y=f2(1); […]

内存应用程序布局

以下问题对我来说是一个令人头疼的问题。 假设我有两个平台具有相同的硬件,相同的操作系统和相同的编译器。 如果我编译完全相同的应用程序,我可以确定两台机器上的内存布局完全相同吗? 换句话说,两个应用程序都具有相同的虚拟地址空间,或者很可能不是这种情况。 谢谢你对此的看法!

为什么内存对齐会在结构中发生变化?

在前一个问题中 ,我了解到当具有8字节对齐的结构嵌入到具有4字节对齐的另一个结构中时,在8字节对齐结构之前需要填充。 了解。 至少我以为我明白了。 VS 2012文档说: 对于结构,联合和数组,对齐要求是其成员的最大对齐要求。 所以,如果我有这样的结构: typedef struct s_inner { unsigned long ul1; double dbl1; fourth_struct s4; unsigned long ul2; int i1; } t_inner; 我希望这个结构的所有成员都是8字节对齐的,因为double是8字节对齐的。 但我的记忆转储告诉我这个: t_inner从地址1B8开始: 1B8 : unsigned long 1B8被填充,因为结构是8字节对齐的 1C0 : double 1C0消耗8个字节 1C8 : fourth_struct如下, 它具有4字节对齐 到目前为止,一切都如预期。 但是现在t_inner内部的对齐开关 :在地址1E8 ,我希望在这里只找到unsigned long int ,填充4个字节,以便后面的int也在8个字节上对齐。 但似乎对齐现在已经改变,因为unsigned long整数不携带填充字节。 相反,以下int以4字节对齐方式放置。 为什么对齐开关在t_inner ? 这里适用哪条规则?

如何获取指针指向的内存大小?

我目前正在研究NUMA机器。 我正在使用numa_free来释放我分配的内存。 但是,与free不同, numa_free需要知道要释放多少字节。 有没有办法知道指针指向多少字节而不追踪它?

如何检测内存泄漏?

我是编程新手,我想知道如何检测内存泄漏? 如果您要推荐一个实用程序,请尝试找一个适用于Mac OS X Lion的实用程序。 PS我试过valgrind,它不适用于10.7 / Lion。

在内核驱动程序中顺序访问大页面

我正在使用一个使用由大页面支持的缓冲区的驱动程序,我发现大页面的后续性存在一些问题。 在用户空间中,程序使用mmap系统调用分配由largepages支持的大缓冲区。 然后通过ioctl调用将缓冲区传送给驱动程序。 驱动程序使用get_user_pages函数来获取该缓冲区的内存地址。 这适用于1 GB的缓冲区大小(1个巨页)。 get_user_pages返回了很多页面( HUGE_PAGE_SIZE / PAGE_SIZE ),但它们都是HUGE_PAGE_SIZE / PAGE_SIZE ,所以没有问题。 我只是使用page_address获取第一页的地址并使用它。 当另一个程序在char设备上执行mmap调用时,驱动程序还可以使用remap_pfn_range将该缓冲区映射回用户空间。 但是,当缓冲区由多个巨页支持时,事情会变得复杂。 似乎内核可以返回由非连续的大页面支持的缓冲区。 即,如果巨页页面的布局是这样的 +——+——+——+——+ | HP 1 | HP 2 | HP 3 | HP 4 | +——+——+——+——+ ,通过保留HP1和HP4,或HP3,然后HP2,可以满足对大页面支持的缓冲区的请求。 这意味着当我在最后一种情况下使用get_user_pages获取页面时,页面0的地址实际上是在页面262.144(下一个巨页的头部)的地址之后的1 GB。 有没有办法隔离访问这些页面? 我尝试重新排序地址以找到较低的地址,这样我就可以使用整个缓冲区(例如,如果内核给我一个由HP3支持的缓冲区,HP2我用作HP2的基地址),但它似乎会扰乱数据在用户空间中(该重新排序的缓冲区中的偏移量0可能在用户空间缓冲区中偏移1GB)。 TL; DR:给定> 1个无序的大页面,有没有办法在Linux内核驱动程序中按顺序访问它们? 顺便说一句,我正在使用3.8.0-29通用内核的Linux机器。

你如何评估内存消耗?

我想知道是否有一种有效的方法来测量特定C数据结构的实际内存消耗。 目标是根据在这些数据结构上的特定操作之后内存使用情况如何变化来制定基准。 我不寻求一种方法来计算使用中的物体数量; 我确实想知道在压力下对象的内存使用量究竟有多大。 有没有一种标准的方法可以用C代码或外部来做到这一点? (一些相当于time (1)效用将是一个开始)。 显然,我可以追踪每个指针,并对所有sizeof进行总和。 如果这是唯一的方法,请告诉我。 我想知道是否有一种更简单的方法。 或者也许是图书馆为我做这件事。

如何确定结构的内存布局?

假设我有以下结构(在C中): struct my_struct { int foo; float bar; char *baz; }; 如果我现在有一个变量,比方说 struct my_struct a_struct; 我怎样才能知道该结构的字段将如何在内存中布局? 换句话说,我需要知道a_struct.foo , a_struct.bar和a_struct.baz的地址是什么。 我不能以编程方式做到这一点,因为我实际上正在交叉编译到另一个平台。 澄清 感谢到目前为止的答案,但我无法以编程方式(即使用offsetof宏,或使用小型测试程序)执行此操作,因为我正在交叉编译,我需要知道字段将如何在目标平台上对齐。 我知道这是依赖于实现的,这是我的问题的重点。 我正在使用GCC编译,针对ARM架构。 我最终需要的是能够从目标平台转储内存并使用其他工具解析它,例如Python的struct库。 但为此,我需要知道这些领域是如何布局的。

检测内存页面大小

是否有一种可移植的方法来使用C或C ++代码(以编程方式)检测内存页面大小?

擦除后无法写入闪存

所以擦除后我不能直接写入内部闪存。 如果在写操作之前没有擦除操作,那么我可以。 任何想法为什么? 编程function返回“成功写入”值,但在查看内存时,不会写入任何数据。 这是代码: uint32_t pageAddress = 0x08008000; uint16_t buffer = 0xAAAA; HAL_FLASH_Unlock(); FLASH_PageErase(pageAddress); HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, pageAddress, buffer); HAL_FLASH_Lock(); 我已经尝试在擦除和编程之间锁定内存,在这些操作之间造成延迟,这无济于事。