通常,可以使用malloc和free函数以实现定义的方式分配内存.但是,通常需要管理来自特定区域的内存分配.例子包括:
每次出现这种要求时,有没有办法重新使用malloc来管理这些区域(Linux),而不是编写一次性堆实现?否则,任何"众所周知的"内存分配器(例如dmalloc,ptmalloc等)是否支持从特定区域分配?
例:
void *pool = mmap(/* my file */);
void *pool_manager = mallloc_init(pool, /* size */);
void *p = malloc_ex(pool, 1024);
free_ex(pool, p);
Run Code Online (Sandbox Code Playgroud) C标准库提供的round,lround和llround家庭的C99功能.但是,这些功能不符合IEEE-754标准,因为它们没有实现IEEE规定的半个到偶数的"银行家舍入".如果小数分量恰好为0.5,则半到均匀舍入要求将结果四舍五入到最接近的偶数值.相反,如cppreference.com上所述,C99标准要求半个零距离
1-3)计算最接近arg的整数值(浮点格式),将中间情况舍入为零,不管当前的舍入模式如何.
在C中实现舍入的通常的临时方法是(int)(x + 0.5f)尽管在严格的IEEE-754数学中不正确,但通常由编译器将其转换为正确的cvtss2si指令.然而,这肯定不是一个可移植的假设.
如何实现一个函数,它将使用半对偶语义对任何浮点值进行舍入?如果可能,该函数应仅依赖于语言和标准库语义,以便它可以在非IEEE浮点类型上运行.如果这不可能,则根据IEEE-754位表示定义的答案也是可接受的.请用<limits.h>或表示任何常数<limits>.
C99语言具有直接指定二进制浮点文字(因此称为"hexfloats")的指数和尾数的能力,例如0x1.0p0is 1 * pow(2, 0)或1.0.C++ 11标准包括C99标准库,包括从字符串序列化和反序列化hexfloats的能力,但由于某些神秘的原因不包括文字本身.
(1)为什么语言委员会不会添加这个对数字计算非常重要的非常简单的功能?
(2)如何在Visual Studio 2013支持的C++ 11子集中实现编译时hexfloat解析?GCC允许在C++中使用hexfloat文字,因此这在GNU世界中不是问题.
编辑:显然hexfloats无法添加到C++ 11,因为它会与用户定义的文字"p"冲突.特别具有讽刺意味的是,由于没有人使用(UDL),因此无法实现实际有用的功能.
在普通的C++设计中,大多数对象可以通过delete语句,free函数或特定于库的等效项来删除free.对于此类对象,unique_ptr Deleter实现可以是通过空基类优化消除的无状态对象.但是,某些库需要使用另一个对象(可能包含函数指针或其他某些上下文)来从该库中删除对象.
typedef struct lib_object lib_object;
struct lib_api {
lib_object (*createInstance)();
void (*freeInstance)(lib_object *o);
};
Run Code Online (Sandbox Code Playgroud)
可以unique_ptr通过将lib_api指针存储为自定义中的数据成员来包装它Deleter,但是如果lib_object需要管理多个实例,例如在容器中,则会使跟踪对象的内存开销加倍.在处理此库时,可以使用哪种模式来维护RAII原则,同时仍保持内存效率?