小编use*_*696的帖子

C++ STL容器无法使用,没有例外,我们可以做些什么呢?

C++的假设是"你用的是什么,你付出的代价".然而,由于例外情况及其在STL中的普遍使用,这可能会非常虚弱.

在任何人说"只是打开异常"之前,生活对于我们必须生活的编程环境并不那么慷慨.我的是内核编程,其中执行环境没有提供足够的C++运行时来展开堆栈等.

当STL容器无法为其底层后备存储重新分配存储时,它们将抛出分配失败异常.当在环境中没有启用异常时,程序将会相当神秘地崩溃:我已经看到实现直接中止或只是假设分配工作即使它没有.

我遇到的许多C ADT库都是通过返回错误代码或将错误作为输出参数来提前解决此问题.

处理这个问题的"最佳"C++方法是什么?

澄清

我不想使用标准库,我不能.我不是在问"我怎么做那些无法做到的事情".我问:"考虑到一个干净的平板,如何建造容器库."

c++ kernel stl intrusive-containers

15
推荐指数
1
解决办法
6150
查看次数

为什么struct stat中的st_size字段已签名?

st_size定义为一个off_t.

off_t定义为有符号整数类型.

为什么st_size定义为签名类型?这可能是消极的吗?如果它是负面的是什么意思?

c unix linux posix

13
推荐指数
2
解决办法
7050
查看次数

C++ 11和[17.5.2.1.3]位掩码类型

标准允许在整数类型,a enum和a 之间进行选择std::bitset.

在给定这些选择的情况下,为什么库实现者会使用其中一个?

例如,llvm的libcxx似乎使用了这些实现选项中的两个(至少)两个的组合:

ctype_base::mask 使用整数类型实现: <__locale>

regex_constants::syntax_option_type使用enum+重载运算符实现: <regex>

gcc项目的libstdc ++使用全部三个:

ios_base::fmtflags 使用枚举+重载运算符实现: <bits/ios_base.h>

regex_constants::syntax_option_type使用整数类型 regex_constants::match_flag_type实现,使用std::bitset
Both 实现:<bits/regex_constants.h>

AFAIK,gdb无法"检测"这三个选项中的任何一个的位域,因此增强调试没有区别.

enum解决方案和整数类型的解决方案应该总是使用相同的空间.std::bitset似乎没有保证,sizeof(std::bitset<32>) == std::uint32_t所以我没有看到什么是特别吸引人的std::bitset.

enum解决方案似乎略显不足类型安全的,因为口罩的组合不会产生一个枚举.

严格地说,前面提到的是n3376而不是FDIS(因为我无法访问FDIS).

在这方面的任何可用的启示将不胜感激.

c++ enums bitmask c++11 libc++

7
推荐指数
1
解决办法
1800
查看次数

为什么析构函数不会修改返回的变量

以下代码使用修改的析构函数i.当析构函数运行时,2应该存储到我们观察到的返回i时.thing()-1

#include <stdio.h>

class Destruct {
    int &i;
public:
    Destruct(int &_i) : i(_i) {}
    ~Destruct() {
        i = 2;
    }
};

int thing() {
    int i = -1;
    Destruct d(i);
    return i;
}

int main() {
    printf("i: %d\n", thing());
}
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
1
解决办法
135
查看次数

标签 统计

c++ ×3

bitmask ×1

c ×1

c++11 ×1

enums ×1

intrusive-containers ×1

kernel ×1

libc++ ×1

linux ×1

posix ×1

stl ×1

unix ×1