我想在地图中插入n个元素,其中n是提前知道的.我不想在每次插入时分配内存.我想在开始时分配所有内存.有没有办法做到这一点?如果是这样,怎么样?写一些内存分配器会有帮助吗?
我运行了GMan的代码并获得了以下输出.通过调用"new"打印GetMem,并从调用delete打印FreeMem.size是请求的字节数,ptr是返回的指针.显然,在插入期间正在进行分配/解除分配.你怎么解释这个?
GetMem大小40,ptr 0x8420008
GetMem大小40,ptr 0x8420038
GetMem大小120,ptr 0x8420068
GetMem大小120,ptr 0x84200e8
FreeMem ptr 0x8420068
FreeMem ptr 0x8420038
FreeMem ptr 0x8420008
插入:[0,0]
GetMem大小40,ptr 0x8420008
FreeMem ptr 0x8420008
插入:[1,2]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
插入:[2,4]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
插入:[3,6]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
插入:[ 4,8]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
插入:[5,10]
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
GetMem例程大小40 ,PTR 0x8420008
freemem在PTR 0x8420008
GetMem例程大小40,PTR 0x8420008
freemem在PTR 0x8420008
freemem在PTR 0x84200e8
St9bad_alloc
我正在学习D,并且因为我得到的错误而感到困惑.
考虑以下:
module helloworld;
import std.stdio;
import std.perf;
ptrdiff_t main( string[] args )
{
auto t = new PerformanceCounter; //From managed heap
//PerformanceCounter t; //On the stack
t.start();
writeln( "Hello, ", size_t.sizeof * 8, "-bit world!" );
t.stop();
writeln( "Elapsed time: ", t.microseconds, " \xb5s." );
return 0;
} //main()
Run Code Online (Sandbox Code Playgroud)
产量非常可观:
Hello, 32-bit world!
Elapsed time: 218 µs.
Run Code Online (Sandbox Code Playgroud)
现在考虑当我尝试在堆栈上初始化PerformanceCounter而不是使用托管堆时会发生什么:
//auto t = new PerformanceCounter; //From managed heap
PerformanceCounter t; //On the stack
Run Code Online (Sandbox Code Playgroud)
产量:
--- killed by signal 10
Run Code Online (Sandbox Code Playgroud)
我很难过.有什么想法为什么这打破?(Mac OS …
在分析我的iOS应用程序时,我多次执行一个简单的任务,我从堆栈中推送和弹出视图,然后拍摄快照.每次执行相同的代码,推送的视图只包含一些图像,一旦视图弹出就会被删除.

现在因为几乎一半的快照的持久计数为0,假设没有废弃的内存会安全吗?
我听说持久性计数大于零的行可能是因为某些内部缓存.
我正在使用Xcode 4.2.1,该应用程序正在使用ARC.
编辑:
感谢Kendall Helmstetter Gelner,我设法进一步调试了这个问题.我可能不应该使用模拟器进行调试.我现在在设备上运行它,现在看起来有一个对象没有被释放:

在查看扩展的详细信息视图后,我认为我刚刚找到了问题的原因.
我正在使用iPhone项目ARC.该应用程序是基于导航的应用程序UINavigationController.
典型的用例是多次从"主" UIViewController转到"次" UIViewController,可能多达100次.辅助控制器有许多静态的本地PNG图像,其中一些是重复的.
我正在分析应用程序,我可以看到,当从"主"控制器转到"辅助"控制器时,它分配大约0.8 MB,但是,当按下后退按钮时,它不会释放内存.所以,当我再次进入辅助控制器时,会分配其他0.8 MB,依此类推......
调试时,我注意到viewDidUnload:辅助UIViewController方法永远不会被调用,但我也读到了这个方法,我应该设置为nil控制器保存的引用.这样做viewDidDisappear:没有用,因为我希望只有在按下后退按钮时才会发生这种情况,也就是说,当从堆栈弹出控制器时(viewDidDisappear:在按下堆栈上的另一个控制器时也会调用该方法).
所以问题是:我有什么必须这样做的吗?我可以强制调用该方法吗?这种行为是否正常(分析,在"主要" - >"次要" - >"主要" - >"次要" - > ......的某些周期后,分配达到20MB?
谢谢大家
memory iphone allocation automatic-ref-counting viewdidunload
最近我一直在寻找一个池/分配器机制.Boost Pool似乎提供了解决方案,但仍有一些东西,它无法从文档中推断出来.
object_pool似乎提供了分配需求的好方法1)但是它想为分配器设置一个固定的大小来使用.默认情况下它会抓住内存.如果可能的话,我想给它一个可以在其中播放的地址空间.
char * mem_for_class[1024*1024];
boost::object_pool<my_class,mem_for_class> q;
Run Code Online (Sandbox Code Playgroud)
要么:
const int max_no_objs=1024;
boost::object_pool<my_class,max_no_objs> q;
Run Code Online (Sandbox Code Playgroud)
虽然UserAllocator在Boost :: Pool中可用; 它似乎打败了这一点.我担心所需的控制会使它效率太低......而且从头开始会更好.
问题有点类似于第一个问题.在将boost :: pool_allocator提供给std-type-class(例如map)时,boost pool是否提供了限制分配内存的位置的方法
嵌入式linux编程.系统必须继续运行.所以我们不能冒任何内存分段的风险.目前我主要是静态分配(堆栈),还有一些原始的"新".我想要一个分配方案,确保每次程序循环时我使用相同的内存区域.速度/空间很重要,但安全仍然是首要任务.
我希望StackOverflow是值得一提的地方.我试图联系Boost :: Pool"Stephen"的作者,但没有运气.我还没有找到任何特定于Boost的论坛.
我希望能够使用带有std :: vector的自定义分配器,以便在堆栈上存储小数据缓冲区(例如,小于1024字节),并且只有更长的向量存储在堆上.作为拥有Fortran背景的人,每次我必须在五行子程序的持续时间内进行堆内存分配以存储六个元素时,它会让我感到身体疼痛!
Howard Hinnant发布了他的short_alloc分配器,它正是我正在寻找的东西,如果我用gcc编译它就可以了.但是,在Visual C++中,我无法编译它.在Visual C++ 2013中,部分问题是太多的C++ 11关键字不受支持,但即使我已经#DEFINE'd所有这些关键字,我仍然遇到了问题.今天我尝试在Visual C++ 2015 CTP 5中进行编译,现在所有关键字都得到了支持,但编译最终因同样的原因而失败.
问题是:由于一个我不能声称完全理解的原因,Hinnant的代码默认复制构造函数但删除了复制赋值运算符:
short_alloc(const short_alloc&) = default;
short_alloc& operator=(const short_alloc&) = delete;
Run Code Online (Sandbox Code Playgroud)
尝试编译时,这会在Visual C++中触发以下错误:
xmemory0(892): error C2280: 'short_alloc<int,1024> &short_alloc<1024>::operator =(const short_alloc<1024> &)': attempting to reference a deleted function
Run Code Online (Sandbox Code Playgroud)
令我更加困惑的是,如果我修改Hinnant的代码来说
short_alloc(const short_alloc&) = default;
short_alloc& operator=(const short_alloc&) = default;
Run Code Online (Sandbox Code Playgroud)
...然后我仍然获得完全相同的错误消息.
作为参考,这是我的测试代码:
#include <iostream>
#include <vector>
#include "short_alloc.h"
void populate_the_vector(std::vector<int, short_alloc<int, 1024> > &theVector)
{
arena<1024> B;
std::vector<int, short_alloc<int, 1024> > anothertestvec{(short_alloc<int, 1024>(B))};
anothertestvec.resize(10);
for (int …Run Code Online (Sandbox Code Playgroud) 当std::vector满了,分配新的内存.从我读到的,新容量以几何级数增长(但这与问题无关),然后旧信息被复制到新的内存区域,旧的信息被释放.
基于这个假设,我的问题是:
为什么编译器不会试图在我们的末尾看到是否有足够的连续免费使用内存,只在我们的末尾std::vector分配一部分std::vector,并且不浪费时间复制?
人们是否试图实现这一点,但是决定它不值得这样做?(平均/总是)
是否还有其他更微妙的原因导致这种情况没有发生?
我运行julia --track-allocation prof.jl导致以下输出:
- using FixedSizeArrays
-
- immutable KernelVals{T}
- wavenumber::T
- vect::Vec{3,T}
- dist::T
- green::Complex{T}
- gradgreen::Vec{3,Complex{T}}
- end
-
- function kernelvals(k, x, y)
- r = x - y
0 R2 = r[1]*r[1]
0 R2 += r[2]*r[2]
0 R2 += r[3]*r[3]
0 R = sqrt(R2)
-
0 ? = im*k
0 expn = exp(-? * R)
0 fctr = 1.0 / (4.0*pi*R)
0 green = fctr * expn
64 gradgreen = -(? + …Run Code Online (Sandbox Code Playgroud) 我正在将Rust绑定写入C库,该库可以选择使用第三方内存分配器.它的界面如下所示:
struct allocator {
void*(*alloc)(void *old, uint);
void(*free)(void*);
};
Run Code Online (Sandbox Code Playgroud)
我想,相应的Rust结构如下:
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct Allocator {
alloc: Option<extern "C" fn(*mut c_void, c_uint) -> *mut c_void>,
free: Option<extern "C" fn(*mut c_void)>,
}
Run Code Online (Sandbox Code Playgroud)
如何实现这两个应该模仿分配器的extern函数?我没有找到任何真正看起来像Rust中的allocator API(但我理解为什么),所以我很好奇是否有可能.
例如:
#include <stdio.h>
int main (void) /* Why int and not short int? - Waste of Memory */
{
printf("Hello World!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么main()通常用inttype 定义类型,如果通常只返回0或1,则在32位内存上分配4个字节,而其他类型(例如short int(2个字节,32位)甚至char(1个字节,32位)会节省更多的内存吗?
它浪费了内存空间。
注意:问题不是给定线程的重复;它的答案仅对应于返回值本身,而与明确关注的数据类型不对应。
问题是针对C和C ++的。如果这些答案之间的答案有所变化,请在提到特定语言的上下文时分享您的智慧。
allocation ×10
c++ ×5
memory ×4
c ×2
boost ×1
c++11 ×1
d ×1
heapshot ×1
instruments ×1
ios ×1
iphone ×1
julia ×1
map ×1
objectpool ×1
optimization ×1
phobos ×1
profiling ×1
raii ×1
rust ×1
stack ×1
stl ×1
types ×1
vector ×1
visual-c++ ×1