草庐IT

c++ - 编译器控件如何帮助在 C++ 中分配和释放内存?

我在一本C++书中读到,malloc()和free()是库函数,因此不在编译器的控制范围内。但是,如果您有一个运算符执行动态存储分配和初始化的union操作(new),另一个运算符执行清理和释放存储的union操作(delete),编译器仍然可以保证为所有对象调用构造函数和析构函数。所以,我想知道编译器是如何执行的?任何示例或演示都将被应用。提前致谢。 最佳答案 mallocfunction返回一block连续的内存,仅此而已。如何类型转换和使用它(用于您的对象)是您的问题。虽然newoperator返回内存中分配的对象。尽管两者都

c++ - 试图理解 C++ 中的 * 和 &

这个问题在这里已经有了答案:Whatarethedifferencesbetweenapointervariableandareferencevariable?(44个答案)关闭7年前。我有几个问题。这不是家庭作业。我只是想更好地理解。如果我有int*b=&k;那么k必须是一个整数,b是指向k在内存中的位置的指针,对吗?b的底层“数据类型”是什么?当我输出它时,它返回类似0x22fe4c的东西,我假设它是内存位置2293324的十六进制,对吗?内存位置“2293324”到底在哪里?“堆”?如何输出内存位置0、1、2等位置的值?如果我输出*b,这与直接输出k是一样的,因为*不知何故意味着

C++ 内存模型 : do seq_cst loads synchronize with seq_cst stores?

在C++内存模型中,所有顺序一致的操作的所有加载和存储都有一个总顺序。我想知道这如何与具有其他内存顺序的操作交互,这些内存顺序在顺序一致的加载之前/之后排序。例如,考虑两个线程:std::atomica(0);std::atomicb(0);std::atomicc(0);////////////////ThreadT1////////////////Signalthatwe'vestartedrunning.a.store(1,std::memory_order_relaxed);//IfT2'sstoretoboccursbeforeourloadbelowinthetotal//

c++ - 什么是 __asm volatile ("pause"::: "memory");做?

我正在查看具有以下代码结构的开源C++项目:while(true){//Dosomethingworkif(some_condition_becomes_true)break;__asmvolatile("pause":::"memory");}最后一条语句是做什么的?我知道__asm意味着它是一个汇编指令,我发现一些关于pause指令的帖子说线程有效地暗示核心释放资源并给其他线程更多资源(在超线程的上下文中)。但是:::和memory有什么作用呢? 最佳答案 它是_mm_pause()和一个编译内存屏障,包装在一个GNUCExte

c++ - 如何优化在频繁调用的函数中将大型 std::unordered_map 重用为临时函数?

用一个工作示例简化了问题:我想多次重用std::unordered_map(我们称它为umap),类似于以下虚拟代码(它没有做任何有意义的事情)。我怎样才能使这段代码运行得更快?#include#include#includeunsignedsize=1000000;voidfoo(){std::unordered_mapumap;umap.reserve(size);for(inti=0;i在我的原始代码中,我想在umap中存储矩阵条目。每次调用foo时,键值从0到N开始,每次调用foo时N可以不同,但​​索引有10M的上限。此外,值可以不同(与此处始终为i*0.1的虚拟代码相反)。

c++ - 使用删除与智能指针释放内存以及释放内存的正确方法

我正在为大学做一个项目,我试图找出如何正确删除内存,以及我想出的删除方式是否与使用智能指针具有相同的效果。这是一个包含在公司和团队中工作的所有员工的类,这些员工基本上具有指向某些员工的指针vector。classCompany{private:std::stringcompanyInfo;std::vectoremployees;std::vectorteams;public:Company();~Company();std::stringgetCompanyInfo()const;voidsetCompanyInfo(conststd::string&companyInfo);boo

c++ - 将大量数字 vector 保存到硬盘驱动器

我使用unsignedshort类型的vector在RAM中分配了一大块连续字节。vectortestDump(204800000);for(intk=0;k现在我想将这个vector保存到我的硬盘驱动器中。如何以及最快的方法是什么?数据量相当大(~1/2GB)。我尝试了以下方法:ofstreamoutfile("allMyNumbers.txt",ios::out|ios::binary);outfile.write(&testDump[0],testDump.size());但我收到以下错误:cannotconvertparameter1from'unsignedshort*'to

c++ - pthreads 中的内存模型规范

使用pthread是否可以保证一个线程中的内存写入何时在其他线程中可见?与Java相比,Java语言规范有一个sectionthatspecifiestheinteractionoflocksandmemory这使得编写可移植的多线程Java代码成为可能。是否有相应的pthreads规范?当然,您总是可以让共享数据变得不稳定,但这不是我想要的。如果这取决于平台,是否有事实上的标准?还是应该使用另一个线程库? 最佳答案 POSIX在4.11MemorySynchronization中指定内存模型:Applicationsshallen

c++ - 为什么 free() 没有释放我的 Arduino Uno 上的 RAM

我试图通过在free()函数中使用变量后删除它来释放RAM,但我的RAM没有清理。我想没有垃圾清理发生?在我退出代码部分(范围内的if语句、while循环或函数)后空间会被清理,但free()语句本身不会清理。我正在执行以下操作来检查RAM:intfreeRam(){externint__heap_start,*__brkval;intv;return(int)&v-(__brkval==0?(int)&__heap_start:(int)__brkval);}此外,如何“释放”这样的内存? 最佳答案 您不能期望__brkval会因

c++ - 在 C++ Builder 中编译 Boost 库时的警告

当我尝试包含时收到警告在C++生成器中。对于我包含的每个单元,C++Builder都会显示这两行:thread_heap_alloc.hpp(59):W8128Can'timportafunctionbeingdefinedthread_heap_alloc.hpp(69):W8128Can'timportafunctionbeingdefined已经尝试了一些东西,但没有任何效果。它编译正确,但是,它让我很紧张。为什么显示此消息?行是:#includenamespaceboost{namespacedetail{inlineBOOST_THREAD_DECLvoid*allocate