这个问题对于嵌入式开发尤为重要.异常处理为生成的二进制输出增加了一些空间.另一方面,没有例外,错误需要以其他方式处理,这需要额外的代码,这最终也会增加二进制大小.
我对你的经历很感兴趣,特别是:
请仅以我的问题为指导.欢迎任何输入.
附录:对于特定的C++对象/可执行文件,是否有任何人具有具体的方法/脚本/工具,它将显示由编译器生成的代码和专用于异常处理的数据结构占用的已加载内存占用的百分比?
我意识到这可能是主观的,所以会问一个具体的问题,但首先,背景:
我一直是一名嵌入式软件工程师,但通常在OSI堆栈的第3层或第2层.我不是一个硬件家伙.我一般都经常使用电信产品,通常是手机/手机,这通常意味着像ARM 7处理器.
现在我发现自己处于一个更通用的嵌入式世界中,在一个小型的初创公司中,我可能会转向"不那么强大"的处理器(这是主观位) - 我无法预测哪个.
我已经阅读了很多关于嵌入式系统中C++异常处理的争论,并没有明确的答案.有一些关于可移植性的小担忧和一些关于运行时的担忧,但它似乎主要归结为代码大小(或者我正在阅读错误的辩论?).
现在我必须决定是否使用或放弃异常处理 - 对于整个公司,永远(它将进入一些非常核心的s/w).
这可能听起来像"一根绳子有多长",但有人可能会回答"如果你的琴弦是8051,那就不要.如果,OTOH,那就是......".
我跳哪个方向?超级安全,失去一个好的功能,或特殊的代码,可能会在以后遇到问题?
似乎这个简单的shuffle算法会产生偏差的结果:
# suppose $arr is filled with 1 to 52
for ($i < 0; $i < 52; $i++) {
$j = rand(0, 51);
# swap the items
$tmp = $arr[j];
$arr[j] = $arr[i];
$arr[i] = $tmp;
}
Run Code Online (Sandbox Code Playgroud)
你可以尝试...而不是使用52,使用3(假设只使用3张卡),并运行10,000次并计算结果,你会看到结果偏向某些模式......
问题是......它会发生什么简单的解释?
正确的解决方案是使用类似的东西
for ($i < 0; $i < 51; $i++) { # last card need not swap
$j = rand($i, 51); # don't touch the cards that already "settled"
# swap the items
$tmp = $arr[j];
$arr[j] = $arr[i];
$arr[i] = $tmp; …Run Code Online (Sandbox Code Playgroud) 我目前正在使用带有64 KB SRAM的ARM Cortex M3处理器构建嵌入式系统.目前,我正在寻找一种方法来确保使用STL容器确定性能,其中包括确保在运行时不会最终耗尽内存.
我主要关注STL容器如何执行动态内存分配.虽然我可以利用自定义分配器让这些结构从我预留的池中获取内存,但我需要为每个结构设置一个单独的池,以确保结构的一个实例不能占用另一个实例的空间.
我正在与这个项目中的其他人一起工作,他们不想关注内存的原始分配,并且更愿意能够利用"众所周知的"数据结构(堆栈,队列,双端队列等).因此,我正在考虑围绕C阵列构建包装器以提供这些结构.这将支持静态分配支持这些容器所需的内存,并允许其他开发人员根据编译器提供的代码大小信息知道他们在运行时之前实例化的容器的大小.在我看来,这可以保证在运行时不会发生内存中断问题,并大大简化了系统设计.
另一种选择是在系统初始化时分配STL容器.在初始化期之后,不会发生额外的动态内存分配.但是,据我所知,标准C++ STL数据结构不支持这一点 - 它要求堆栈之类的容器能够预先分配(类似于向量).
对于我关于围绕标准C阵列构建类的提议有什么意见,我将不胜感激?另外,是否有更简单的方法在编译时分配静态大小的STL容器,例如静态大小的堆栈或队列?(我知道这可能是矢量,但其他我不确定)
注意:我已经阅读了另一个问题(嵌入式C++是否使用STL),但是这个问题的作者并未明确他们有多少内存(除了他们如何使用ARM7进程)或似乎是考虑类似于我的解决方案.
第二个注意:我知道对于一些开发人员来说,64 KB的SRAM可能看起来像很多内存.事实上,我已经在AVR处理器上进行了大量减少内存的开发,所以我理解这个观点.但是,从我目前的(可能是未知的)视图来看,在谈论STL容器时,64 KB的内存并不多.
c++ stl deterministic dynamic-memory-allocation static-memory-allocation
我在代码中发现了一个疯狂的错误.
我写了以下这一行:
GLfloat* points = new GLfloat(1024);
Run Code Online (Sandbox Code Playgroud)
而不是
GLfloat* points = new GLfloat[1024];
Run Code Online (Sandbox Code Playgroud)
我才注意到它.在我发现错误之前,我的代码编译并运行了几次.我意识到这是侥幸的,但我的问题是我最初的线路是什么?
我注意到它看起来有点像使用指向已分配内存的指针创建一个类.它是否在堆上创建单个GLfloat,初始值为1024.0?如果这是真的,为什么它是有效的语法?(GLfloat不是一个类,是吗?)
寻找没有标准库的特定C++环境(编译器,操作系统,硬件等)(例如"Nintendo 3DS的x版本gcc")
某些C++库(如Box2D或TinyXML2)旨在实现超级便携,如果有的话,只使用很少的标准库.但是,我并不完全理解这种方法. 哪些主动使用的C++环境缺乏(大多数,如果不是全部)标准库的支持?
如果我使用C++语言编程编写嵌入式Linux系统的代码,是否存在重大问题?
实际上,我有意使用arm-uclibc编译器将一些代码移植到arm linux.
谢谢