草庐IT

延时分配

全部标签

c++ - 类型删除到函数调用签名而不会有浪费内存分配的风险?

我想要一些可以接受任何可调用对象的代码,并且我不想在头文件中公开实现。我不想冒在堆或自由存储上分配内存的风险(抛出和性能下降的风险,或者我在无法访问堆的代码中)。没有值语义可能就足够了:通常在当前作用域结束之前完成调用。但如果不是太昂贵,值语义可能会有用。我能做什么?现有的解决方案存在问题。std::function分配并具有值语义,原始函数指针缺乏传输状态的能力。传递C风格的函数指针-空指针对对调用者来说是一种痛苦。如果我确实需要值语义,C风格的函数指针实际上不起作用。 最佳答案 我们可以通过C风格的虚表来使用类型删除而无需分配。

c++ - 是否可以让 std::vector<char> 使用选定的内存对齐方式分配内存

我正在将进程的内存复制到vector中缓冲区,并希望为此vector分配的内存具有比默认值更高的对齐方式。这是因为我正在该缓冲区中寻找任意类型的模式,其中内存可以代表任何东西-我希望我正在寻找的任何值/类型对都根据它的类型对齐。也许我可以使用“偏移量”来解决这个问题,但我宁愿让我的字符缓冲区对齐。除了创建vector之外,还有什么办法可以做到这一点吗?相反? 最佳答案 我可以使用自定义分配器解决我的问题。boost::alignment::aligned_allocator示例#include#includetemplateusin

c++ - 一种动态分配多维数组的方法

敬礼..我在一本书中学习多维数组的动态分配,我找到了一些方法,现在没有问题了。但是这本书的作者给我们展示了一个方法,但是它并不能正常工作。是这样的:pbeans=newdouble[3][4];//Allocatememoryfora3x4array这是错误:errorC2440:'=':cannotconvertfrom'int(*)[4]'to'int*'我应该如何定义pbeans(如果这种类型的编码是合法的)?问题到底是什么?问候。 最佳答案 这在我的FAQonarrays中有介绍:double(*pbeans)[4];pbe

###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯

 前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。   目录一. 延时函数的生成 1.通过延时计算器得到延时函数 2.可赋值改变的延时函数 二. LED模块编写原理 1.LED模块图  2.编写原理(1)编写原理(2)快捷编程 (3)十六进制编程 三. 具体编写程序 1.通过生成没有改写的延时函数 2.可赋值延时函数编写 四. LED流水灯视频 一. 延时函数的生成  1.通过延时计算器得到延时函数   步骤:1.打开STC-ISP找到软件延时计算器2.先了解所用51单片机的频率(这里的51单片机频率为11.

c++ - 是否可以使用 Windows API 分配段?

我想知道Windows程序是否可以在进程的本地描述符表中分配一个段描述符。是否有WindowsAPI函数可以使用提供的线性偏移量、段长度和标志组合(RWX)将新的段描述符安装到正在运行的进程的LDT? 最佳答案 可以使用未记录的NTAPI,特别是NtSetLdtEntries。请注意,Windowsx86-64不会设置LDT,因此这仅适用于x86。Here's一些代码。 关于c++-是否可以使用WindowsAPI分配段?,我们在StackOverflow上找到一个类似的问题:

c++ - 使用堆栈分配存储的标准兼容字符串流?

目前在野外似乎找不到任何可用的东西,这看起来很奇怪。所以在我自己动手之前,有没有人知道在堆栈上分配存储的符合标准的字符串流?我正在考虑2种方法来实现这一目标:最初在堆栈上使用静态大小的缓冲区(可能是允许编译时自定义的模板参数)当空间用完时恢复使用动态存储当空间用完时使用alloca增加堆栈存储这将允许将短于预定大小的字符串快速输入到字符串流中。选择合适的初始大小意味着可以在不频繁调整堆大小的情况下实现诸如日志记录之类的事情。 最佳答案 您可以使用std::basic_stringbuf,pooled_allocator>获得相同的好

C++ 内存分配器架构

我需要在Linux下为C++编写Hoard分配器。虽然算法非常简单,但我不明白在哪里(以及如何)存储分配器数据(例如堆)这就是我的看法:分配器不是一个进程,它是一组函数,任何应用程序都可以使用。每个应用程序都有自己的堆。应用启动时发生了什么?分配器如何发现堆已经创建?分配器如何创建、存储和销毁(关闭应用程序时)堆?当调用函数时,如何找出它运行在哪个线程(或哪个处理器)? 最佳答案 在应用程序启动期间可能不会发生太多事情,除非分配器被设计并挂接到应用程序启动代码中以抢先从操作系统请求一些内存。堆并不是真正创建的。分配系统退出并在需要时

C++ 对象 block 分配与单独分配

block分配与单个对象分配的主要区别是什么。让我们说intiCount=5;inti=0;while(i第二种方法会为我节省一些内存空间吗?。我听说我们分配的每个对象都被16个管理字节包围。所以block分配将只使用一个headerguard。是真的吗? 最佳答案 你做的每个分配也会分配分配头(有时也会分配一些页脚保护结构),这取决于你的分配器使用的算法。Here,您可以找到其中一种算法的描述。当您分配一个数组时,分配器(主要是malloc())将以sizeof(element)*count作为参数被调用,并将整个数组作为一个分配

c++ - 内存重新分配 - 保留我的数据

假设我在堆中有一些数组,由malloc或new构造并不重要。我需要最有效的方法来放大它。我的意思是,如果它有足够的可用空间位于已分配的数据之后,我可以保持我的数据不变。是否可以在C++中维护?realloc是否以这种方式工作? 最佳答案 是的,realloc就是您要找的。请注意,它不适用于new,您必须使用malloc(或者说,calloc)。另外,有时扩展内存是不可能的,所以realloc会尝试为你做这件事,但如果不能——它会求助于分配新内存,将你的内容复制到一个新地方并释放旧内存。

c++ - 为什么预分配函数指针的性能比分支差?

我有一个带有enum成员变量的类。其中一个成员函数基于此enum的行为,因此作为“可能的”优化,我将两种不同的行为作为两个不同的函数,并为类提供了一个在构造时设置的成员函数指针.我模拟了这样的情况:enumcatMode{MODE_A,MODE_B};structcat{cat(catModemode):stamp_(0),mode_(mode){}voidupdate(){stamp_=(mode_==MODE_A)?funcA():funcB();}uint64_tstamp_;catModemode_;};structcat2{cat2(catModemode):stamp_(0