草庐IT

信道分配

全部标签

c++ - 在 C 中复制字符串时为空终止字符分配空间?

constchar*src="你好";调用strlen(src);返回大小5...现在说我这样做:char*dest=newchar[strlen(src)];strcpy(dest,src);这似乎不应该起作用,但当我输出所有内容时它看起来是正确的。似乎我没有为最后的空终止符分配空间......这是对的吗?谢谢 最佳答案 您没有为终止符分配空间是正确的,但是不这样做并不一定会导致您的程序失败。您可能会覆盖堆上的以下信息,或者您的堆管理器会将分配大小四舍五入为16字节的倍数或类似的东西,因此您不一定会看到此错误的任何可见影响。如果您

c++ - 启动 C++ 项目。我应该担心释放动态分配的内存吗?

我对C相当精通,在C中释放内存是必须的。但是,我正在开始我的第一个C++项目,我听说过一些关于如何通过使用共享指针和其他东西不需要释放内存的事情。我应该在哪里阅读?这是对正确的deleteC++功能的有值(value)的替代吗?它是如何工作的?编辑我很困惑,有些人说我应该使用new分配并使用smartpointers进行释放过程。其他人说我一开始就不应该分配动态内存。其他人说,如果我使用new,我也必须像C一样使用delete。那么哪种方法被认为更标准并且更常用? 最佳答案 WhereshouldIreadaboutthis?Her

c++ - 是否有比 boost::object_pool 更快的 C++ 堆分配/释放机制可用?

这周我发现了boost::object_pool并且惊讶于它比普通的新建和删除快了大约20-30%。为了测试,我编写了一个小型C++应用程序,它使用boost::chrono为不同的堆分配器/释放器(shared_ptr)计时。这些函数本身使用“新建”和“删除”进行60M次迭代的简单循环。代码下方:#include#includeusingstd::shared_ptr;#include#include#include#include#include#include"TestClass.h"constlonglTestRecursion=60000000L;voidWithSmartP

c++ - 是否可以使用 operator new 从堆以外的其他地方进行分配?

这是我的应用程序的上下文:我正在开发一个使用来自不同设备的RAM的嵌入式系统。一部分在微Controller的内部RAM(128kB)中,另一部分是外部RAM(1MB)。这些内存映射到微Controller的地址空间,但位于非连续区域。内部RAM用于系统堆栈、任务堆栈和堆。外部RAM用于静态分配的数据(池、缓冲区和所有“static...”内容)我正在尝试实现一个简单的内存管理结构,并且作为它的一部分能够创建一个分配器,该分配器可以使用operatornew的分配算法但使用另一个内存源,而不是系统heap而是其他地方的内存区域。你知道这是否可能吗?一个使用示例可以是保留100kB的外部

c++ - Haskell FFI内存分配性能问题

我正在使用FFItoC将中等数量的数据(~100MB)发送到C程序——只是一个字符串列表。但是,我使用的所有方法似乎都花费了不合理的时间(~10秒)。分析后,似乎是实际的内存分配需要时间。我试过:作为常规字符串发送(newCString)转换为ByteStrings(unsafeUseAsCString)转换为字符vector(unsafeWith>>=withForeignPtr...)通过CFFI发送数据的最快方法是什么? 最佳答案 正如ReidBarton在评论中所说,如果您有100MB的字符串,无论您如何处理它,您的分配一开

c++ - 使用带有 boost::bimap 的自定义分配器

我正在努力boost同时使用Boost图形库和boost::bimap的程序的性能。分析显示大部分时间都花在了内存分配和释放上。使图形库的adjacency_list类使用boost::fast_pool_allocator显着boost了性能。剩余内存分配的很大一部分发生在boost::bimap中,因此我也想尝试在那里使用自定义分配器。documentation说您可以将分配器指定为bimap的最后一个模板参数,但它没有说明分配器本身的模板参数应该是什么类型。例如,对于类型X和Y,在boost::bimap,set_of,boost::fast_pool_allocator>Z应该

c++ - 将 std::uninitialized_fill() 与任何分配器一起使用是否有意义?

用std::uninitialized_fill()初始化内存有意义吗?当用户作为参数传递的分配器已用于获取内存本身时,在库中?我问这个是因为分配器应该提供自己的construct()方法(allocate()方法除外),其实现可能与标准方法不同,因此可能是std::uninitialized_fill()并不总是适用于所有情况。准确的说,我的疑惑来自Stroustrup写的C++书(附录E“Standard-LibraryExceptionSafety”,E.3.1节),书中作者给出了一个templatevector::vector(size_typen,constT&val,con

c++ - 为最终的 future 自定义内存分配器做准备

我的项目是在c++11中,使用vs2012。现在我觉得不需要使用自定义内存管理,但是我应该采取什么安排以促进最终的future修改?我想过为“new”/“new[]”/“delete”/“delete[]”使用宏,为容器和智能指针使用typedef。什么是最佳实践? 最佳答案 在我看来,您所要做的基本上就是确定您将在整个实现过程中使用的特定约定。让你的架构分配器知道的一个很好的模板是看看这是如何为STL容器实现的,并尝试设计你像它们一样的数据结构。例如,如果您在std::vector上查找示例interface此容器的第二个参数始终

c++ - 如何创建 C++ 11 非默认可构造分配器?

这个主题出现在这个线程中,关于VisualStudio2015的std::list::sort()的变化:`std::list::sort()`-whythesuddenswitchtotop-downstrategy?新版本的std::list::sort不需要默认可构造的std::list,因为它只使用迭代器,并且不创建任何本地列表,所以列表是否可以并不重要'不是默认构造的。之前的版本使用本地列表(注意-列表的每个实例都涉及一个哨兵节点的动态分配):typedeflist_Myt;//...constsize_t_MAXBINS=25;_Myt_Templist,_Binlist[

c++ - 开关状态案例中的不同类型分配,内部模板函数

苹果.hclassApple{public:Apple(int);staticinttypeID;private:intid_;};苹果.cpp#include"Apple.h"Apple::Apple(intpID){id_=pID;}Potato.h,Potato.cpp与苹果相同存储.h#pragmaonce#include"Apple.h"#include"Potato.h"#includeclassStorage{public:Storage();templatevoidstore(foodName*object){(*getBasket()).push_back(objec