C++14新特性

2023-11-02

C++14

维基百科
C++14是C++的现行标准的非正式名称,正式名称为"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。C++14旨在作为C++11的一个小扩展,主要提供漏洞修复和小的改进。C++14标准的委员会草案(Committee Draft)N3690于2013年5月15日发表。[1]工作草案(Working Draft)N3936已于2014年3月2日完成。最终的投票期结束于2014年8月15日,结果(一致通过)已于8月18日公布。[2]

1. 新的语言特性

以下为在C++14中被加入语言核心的特性。

1.1 泛型的lambda

在C++11中,lambda函数的形式参数需要被声明为具体的类型。C++14放宽了这一要求,允许lambda函数的形式参数声明中使用类型说明符auto。[3]

auto lambda = [](auto x, auto y) {return x + y;}

泛型lambda函数遵循模板参数推导的规则。以上代码的作用与下面的代码相同:[4]

struct unnamed_lambda {
  template<typename T, typename U>
    auto operator()(T x, U y) const {return x + y;}
};
auto lambda = unnamed_lambda{};
1. 2 Lambda捕获参数中使用表达式

C++11的lambda函数通过值拷贝(by copy)或引用(by reference)捕获(capture)已在外层作用域声明的变量。这意味着lambda捕获的变量不可以是move-only的类型。

[5] C++14允许lambda成员用任意的被捕获表达式初始化。这既允许了capture by value-move,也允许了任意声明lambda的成员,而不需要外层作用域有一个具有相应名字的变量。[6]这称为广义捕获(Generalized capture),[7]即在捕获子句(capture clause)中增加并初始化新的变量,该变量不需要在lambda表达式所处的闭包域(enclosing scope)中存在;即使在闭包域中存在也会被新变量覆盖(override)。新变量类型由它的初始化表达式推导。用途是可以从外层作用域中捕获只供移动的变量并使用它。

这是通过使用一个初始化表达式完成的:

auto lambda = [value = 1] {return value;}

lambda函数lambda的返回值是1,说明value被初始化为1。被声明的捕获变量的类型会根据初始化表达式推断,推断方式与用auto声明变量相同。

使用标准函数std::move可以使之被用以通过move捕获:

auto ptr = std::make_unique<int>(10); //See below for std::make_unique
auto lambda = [value = std::move(ptr)] {return *value;}
1. 3 函数返回类型推导

C++11允许lambda函数根据return语句的表达式类型推断返回类型。C++14为一般的函数也提供了这个能力。C++14还拓展了原有的规则,使得函数体并不是{return expression;}形式的函数也可以使用返回类型推导。[8]

为了启用返回类型推导,函数声明必须将auto作为返回类型,但没有C++11的后置返回类型说明符:

auto DeduceReturnType();   //返回类型由编译器推断

如果函数实现中含有多个return语句,这些表达式必须可以推断为相同的类型。[9]

使用返回类型推导的函数可以前向声明,但在定义之前不可以使用。它们的定义在使用它们的翻译单元(translation unit)之中必须是可用的。

这样的函数中可以存在递归,但递归调用必须在函数定义中的至少一个return语句之后:[9]

auto Correct(int i) {
  if (i == 1)
    return i;               // 返回类型被推断为int
  else
    return Correct(i-1)+i;  // 正确,可以调用
}

auto Wrong(int i) {
  if(i != 1)
    return Wrong(i-1)+i;  // 不能调用,之前没有return语句
  else
    return i;             // 返回类型被推断为int
}
1. 4 另一种类型推断

C++11中有两种推断类型的方式。auto根据给出的表达式产生具有合适类型的变量。decltype可以计算给出的表达式的类型。但是,decltype和auto推断类型的方式是不同的。特别地,auto总是推断出非引用类型,就好像使用了std::remove_reference一样,而auto&&总是推断出引用类型。然而decltype可以根据表达式的值类别(value category)和表达式的性质推断出引用或非引用类型:[8]

int i;
int&& f();
auto x3a = i;              // x3a的类型是int
decltype(i) x3d = i;       // x3d的类型是int
auto x4a = (i);            // x4a的类型是int
decltype((i)) x4d = (i);   // x4d的类型是int&
auto x5a = f();            // x5a的类型是int
decltype(f()) x5d = f();   // x5d的类型是int&&

C++14增加了decltype(auto)的语法,用来声明变量以及指示函数返回类型。

当decltype(auto)被用于声明变量时,该变量必须立即初始化。假设该变量的初始化表达式为e,那么该变量的类型将被推导为decltype(e)。也就是说在推导变量类型时,先用初始化表达式替换decltype(auto)当中的auto,然后再根据decltype的语法规则来确定变量的类型。

decltype(auto)的语法也可以用于返回类型推导,只需用decltype(auto)代替auto。

decltype(auto)也可以被用于指示函数的返回值类型。假设函数返回表达式e,那么该函数的返回值类型将被推导为decltype(e)。也就是说在推导函数返回值类型时,先用返回值表达式替换decltype(auto)当中的auto,然后再根据decltype的语法规则来确定函数返回值的类型。

#include <iostream>
 
template<typename T>  
T f();
 
struct S {int a;};
 
int a = 0;
S s;
decltype(auto) g1() {return s.a;}
decltype(auto) g2() {return std::move(a);}
decltype(auto) g3() {return (a);}
decltype(auto) g4() {return 0;}
 
int main() {
    decltype(auto) i1 = a;
    decltype(auto) i2 = std::move(a);
    decltype(auto) i3 = (s.a);
    decltype(auto) i4 = 0;
    f<decltype(i1)>();     // i1 为 int 型
    f<decltype(i2)>();     // i2 为 int&& 型
    f<decltype(i3)>();     // i3 为 int& 型
    f<decltype(i4)>();     // i4 为 int 型
    f<decltype(g1())>();  // g1() 返回 int 型
    f<decltype(g2())>();  // g2() 返回 int&& 型
    f<decltype(g3())>();  // g3() 返回 int& 型
    f<decltype(g4())>();  // g4() 返回 int 型
}
1. 5 放松的constexpr函数限制

C++11引入了声明为constexpr的函数的概念。声明为constexpr函数的意义是:如果其参数均为合适的编译期常量,则对这个constexpr函数的调用就可用于期望常量表达式的场合(如模板的非类型参数,或枚举常量的值)。如果参数的值在运行期才能确定,或者虽然参数的值是编译期常量,但不符合这个函数的要求,则对这个函数调用的求值只能在运行期进行。 然而C++11要求constexpr函数只含有一个将被返回的表达式(也可以还含有static_assert声明等其它语句,但允许的语句类型很少)。

C++14放松了这些限制。声明为constexpr的函数可以含有以下内容:[8]

  • 任何声明,除了:
    static或thread_local变量。
    没有初始化的变量声明。
  • 条件分支语句if和switch。
  • 所有的循环语句,包括基于范围的for循环。
  • 表达式可以改变一个对象的值,只需该对象的生命期在声明为constexpr的函数内部开始。包括对有constexpr声明的任何非const非静态成员函数的调用。

goto仍然不允许在constexpr函数中出现。

此外,C++11指出,所有被声明为constexpr的非静态成员函数也隐含声明为const(即函数不能修改*this的值)。这点已经被删除,非静态成员函数可以为非const。[10]

1. 6 变量模板

在C++之前的版本中,模板可以是函数模板或类模板(C++11引入了类型别名模板)。C++14现在也可以创建变量模板。在提案中给出的示例是变量pi,其可以被读取以获得各种类型的pi的值(例如,当被读取为整数类型时为3;当被读取为float,double,long double时,可以是近似float,double或long double精度的值)包括特化在内,通常的模板的规则都适用于变量模板的声明和定义。[6][11]

template<typename T>
constexpr T pi = T(3.141592653589793238462643383);

// 适用于特化规则 :
template<>
constexpr const char* pi<const char*> = "pi";
1. 7 聚合类成员初始化

C++11增加了default member initializer,如果构造函数没有初始化某个成员,并且这个成员拥有default member initializer,就会用default member initializer来初始化成员。聚合类(aggregate type)的定义被改为明确排除任何含有default member initializer的类类型,因此,如果一个类含有default member initializer,就不允许使用聚合初始化。

C++14放松了这一限制,[8]含有default member initializer的类型也允许聚合初始化。如果在定义聚合体类型的对象时,使用的花括号初始化列表没有指定该成员的值,将会用default member initializer初始化它。[12]

struct CXX14_aggregate {
    int x;
    int y = 42;
};

CXX14_aggregate a = {1}; // C++14允许。a.y被初始化为42
1.8 二进制字面量

C++14的数字可以用二进制形式指定。[8]其格式使用前缀0b或0B。这样的语法也被Java、Python、Perl和D语言使用。

1. 9 数字分位符

C++14引入单引号(’)作为数字分位符号,使得数值型的字面量可以具有更好的可读性。[13]

Ada、D语言、Java、Perl、Ruby等程序设计语言使用下划线(_)作为数字分位符号,C++之所以不和它们保持一致,是因为下划线已被用在用户自定义的字面量的语法中。

auto integer_literal = 100'0000;
auto floating_point_literal = 1.797'693'134'862'315'7E+308;
auto binary_literal = 0b0100'1100'0110;
auto silly_example = 1'0'0'000'00;
1. 10 deprecated 属性

deprecated属性允许标记不推荐使用的实体,该实体仍然能合法使用,但会让用户注意到使用它是不受欢迎的,并且可能会导致在编译期间输出警告消息。 deprecated可以有一个可选的字符串文字作为参数,以解释弃用的原因和/或建议替代者。

[[deprecated]] int f();

[[deprecated("g() is thread-unsafe. Use h() instead")]]
void g( int& x );

void h( int& x );

void test() {
  int a = f(); // 警告:'f'已弃用
  g(a); // 警告:'g'已弃用:g() is thread-unsafe. Use h() instead
}

2. 新的标准库特性

2. 1 共享的互斥体和锁

C++14增加了一类共享的互斥体和相应的共享锁[14][15]。起初选择的名字是std::shared_mutex,但由于后来增加了与std::timed_mutex相似的特性,std::shared_timed_mutex成为了更适合的名字。[16]

2. 2 元函数的别名

C++11定义了一组元函数,用于查询一个给定类型是否具有某种特征,或者转换给定类型的某种特征,从而得到另一个类型。后一种元函数通过成员类型type来返回转换后的类型,当它们用在模板中时,必须使用typename关键字,这会增加代码的长度。

template <class T>
type_object<
  typename std::remove_cv<
    typename std::remove_reference<T>::type
  >::type
>get_type_object(T&);

利用类型别名模板,C++14提供了更便捷的写法。其命名规则是:如果标准库的某个类模板(假设为std::some_class)只含有唯一的成员,即成员类型type,那么标准库提供std::some_class_t作为typename std::some_class::type的别名。

在C++14,拥有类型别名的元函数包括:remove_const、remove_volatile、remove_cv、add_const、add_volatile、add_cv、remove_reference、add_lvalue_reference、add_rvalue_reference、make_signed、make_unsigned、remove_extent、remove_all_extents、remove_pointer、add_pointer、aligned_storage、aligned_union、decay、enable_if、conditional、common_type、underlying_type、result_of、tuple_element。

template <class T>
type_object<std::remove_cv_t<std::remove_reference_t<T>>>
get_type_object(T&);
2.3 关联容器中的异构查找

C++标准库定义了四个关联容器类。set和multiset允许用户根据一个值在容器中查找对应的的同类型的值。map和multimap容器允许用户指定键(key)和值(value)的类型,根据键进行查找并返回对应的值。然而,查找只能接受指定类型的参数,在map和multimap中是键的类型,而在set和multiset容器中就是值本身的类型。

C++14允许通过其他类型进行查找,只需要这个类型和实际的键类型之间可以进行比较操作。[17]这允许std::setstd::string使用const char*,或任何可以通过operator< 与std::string比较的类型作为查找的参数。

为保证向后兼容性,这种异构查找只在提供给关联容器的比较器允许的情况下有效。标准库的泛型比较器,如std::less<>与std::greater<>允许异构查找。[18]

2. 4 标准自定义字面量

C++11增加了自定义字面量(user-defined literals)的特性,使用户能够定义新的字面量后缀,但标准库并没有对这一特性加以利用。C++14标准库定义了以下字面量后缀:[17]

  • “s”,用于创建各种std::basic_string类型。
  • “h”、“min”、“s”、“ms”、“us”、“ns”,用于创建相应的std::chrono::duration时间间隔。
  • “if”、“i”、"il"用于创建相应的 std::complex、 std::complex 和
std::complex<long double> 复数类型。
auto str = "hello world"s; // 自动推导为 std::string
auto dur = 60s;            // 自动推导为 chrono::seconds
auto z   = 1i;             // 自动推导为 complex<double>

两个"s"互不干扰,因为表示字符串的只能对字符串字面量操作,而表示秒的只针对数字。[19]

2.5 通过类型寻址多元组

C++11引入的std::tuple类型允许不同类型的值的聚合体用编译期整型常数索引。C++14还允许使用类型代替常数索引,从多元组中获取对象。[17]若多元组含有多于一个这个类型的对象,将会产生一个编译错误:[20]

tuple<string, string, int> t("foo", "bar", 7);
int i = get<int>(t);        // i == 7
int j = get<2>(t);          // Same as before: j == 7
string s = get<string>(t);  //Compiler error due to ambiguity
2.6 较小的标准库特性

std::make_unique可以像std::make_shared一样使用,用于产生std::unique_ptr对象。[6]

std::is_final,用于识别一个class类型是否禁止被继承。

std::integral_constant增加了一个返回常量值的operator()。[17]

全局std::begin/std::end函数之外,增加了std::cbegin/std::cend函数,它们总是返回常量迭代器(constant iterators)。

3. 已被移除或是不包含在C++14标准的特性

因为C++14的主要目的是漏洞修复和小的改进,一些重量级的特性被从C++14中移除,其中有部分将加入C++17标准。

3. 1 关于数组的扩展

在C++11和之前的标准中,在堆栈上分配的数组被限制为拥有一个固定的、编译期确定的长度。这一扩展允许在堆栈上分配的一个数组的最后一维具有运行期确定的长度。[6]

运行期确定长度的数组不可以作为对象的一部分,也不可以具有全局存储期,他们只能被声明为局部变量。运行期确定长度的数组也可以使用C++11的基于范围的for循环。[21]

同时还将添加std::dynarray类型,它拥有与std::vector和std::array相似的接口。代表一个固定长度的数组,其大小在运行期构造对象时确定。std::dynarray类被明显地设计为当它被放置在栈上时(直接放置在栈上,或作为另一个栈对象的成员),可以使用栈内存而不是堆内存。

由于一些设计无法达成一致,这一扩展已被放弃。

3.2 Optional值

类似于C#中的可空类型,optional类型可能含有或不含有一个值。这一类型基于Boost的boost::optional类,而添加了C++11和C++14中的新特性,诸如移动和in-place构造。它不允许用在引用类型上。这个类被专门的设计为一个literal type(如果模板参数本身是一个literal type),因此,它在必要的情况下含有constexpr构造函数。[22]

3. 3 Concepts Lite

被C++11拒绝后,Concepts受到彻底的修改。Concepts Lite是Concepts的一个部分,仅包含类型约束,而不含concept_map和axiom[23]。 ISO/IEC TS 19217:2015 Information technology – Programming languages – C++ Extensions for concepts已出版。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++14新特性 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • Pywin32:Python库的简介、安装和使用攻略

    Pywin32 Python库的简介 安装和使用攻略 Pywin32是Python的一个强大而广泛使用的库 它提供了访问Windows API的接口 以实现处理Windows系统资源的功能 如窗口管理 注册表操作 消息传递等等 这里我们将为
  • 遗传算法解决TSP问题

    一 背景 遗传算法是基于自然选择和自然遗传机制的一种随机搜索算法 具有良好的并行性和全局寻优能力 能够自适应地调整搜索方向 这是一种相对来说比较简单的算法 因为它不需要问题求解者具备非常完备的问题领域知识 它能够通过类似生物体繁殖后代的机制
  • FreeRTOS学习笔记—任务创建和删除

    文章目录 一 任务创建和删除API函数 1 1 xTaskCreate 函数 1 2 xTaskCreateStatic 函数 1 3 vTaskDelete 函数 二 任务创建和删除 动态方法 2 1 任务要求 2 2 程序设计 2 2
  • 关于Collection下的removeAll方法抛出UnsupportedOperationException分析

    起因 这周在开发的过程遇到了以下这个错误 之前一直规范运用Collection的接口 所以这个异常比较少见 所以我就纳闷了 做个一个实验 package src import com google common collect Sets i
  • 《小家:越住越大2》

    第一章 餐厅如何避免杂乱 一般家庭的餐桌物品占用餐桌桌面面积普遍较高 显得餐桌杂乱 可以采用餐边柜与餐桌零距离接触方式方便杂物摆放 也可以采用移动是多层收纳车 如何避免孤单在厨房做饭 厨房与餐厅采用玻璃吊轨门连接 可以使用卡座代替普通餐椅
  • 12,verilog移位操作

    注 学习 交流就在博主的个人weixin公众号 FPGA动力联盟 留言或直接 博主weixin fpga start 私信 Verilog中的移位操作有两类 逻辑移位和算术移位 逻辑右移 gt gt 1个操作数向右移位 产生的空位用0填充
  • 毕业设计-基于深度学习的病理图像细胞核分割

    目录 前言 课题背景和意义 实现技术思路 一 相关技术介绍 二 基于双通路解码的病理图像细胞核分割 三 基于无锚检测的病理图像细胞核分割 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学
  • 函数递归

    函数递归 1 递归是什么 2 递归的限制条件 3 递归举例 4 递归与迭代 1 递归是什么 递归是指函数可以调用自身来解决问题的一种编程技巧 在C语言中 递归是通过函数调用自己来实现的 使用递归可以使某些问题更容易理解和处理 例如 计算一个
  • nginx服务器access_log日志详解

    前言 nginx的log日志分为 access log 和 error log 其中access log 记录了哪些用户 哪些页面以及用户浏览器 ip和其他的访问信息 error log 则是记录服务器错误日志 log format 日志格
  • 服务器上部署前端Vue项目代码

    服务器上部署前端Vue项目代码 本人自己感觉部署前端代码比部署后端难 主要是我在部署的过程中遇到了各种报错 写这篇文章主要是记录一下自己艰难的踩坑过程 最终部署成功 前端框架使用的是Vue3 服务器系统是CentOS7 部署的整个过程主要分
  • SpringBoot各个版本使用Redis之间的区别

    今天在springboot中使用数据库 springboot版本为2 0 2 RELEASE 通过pom引入jar包 配置文件application properties中的redis配置文件报错 提示例如deprecated config
  • 阿里云 MongoDB 的连接使用规范

    阿里云 MongoDB 的连接使用规范 概述 我们在阿里云上的 MongoDB 有两种 副本集 主 被两个节点 分片集 集群 在多个业务同时连接 MongoDB 使用时 最重要的连接数问题 一旦超过最大值即影响其它业务的使用 所以必须要规范
  • Mysql 开源数据源笔记

    DBCP C3P0数据源 tomcat内置的数据源DBCP DBCP 方式1 BasicDataSource source new BasicDataSource source setDriverClassName com mysql jd
  • allegro 遇到的问题汇总 避免忘记

    目录 目录 1 已经布板后如何更新封装 2 如何批量放置VIA 3 如何替换某个过孔 4 OrCAD跟Allegro交互设置 5 在制作封装时 如何修改封装引脚的PIN Number 6 ORCAD画原理图时 off page connec
  • Linux关机命令详解

    在linux下一些常用的关机 重启命令有shutdown halt reboot 及init 它们都可以达到重启系统的目的 但每个命令的内部工作过程是不同的 Linux centos重启命令 1 reboot 2 shutdown r no
  • 表格与表单的嵌套关系

    表格与表单的嵌套关系 想要用表格与表单做一个注册界面 却对这两个元素的嵌套关系挡住的脚步 到底是表格里面放置表单呢 还是表单里面放置表格呢 没关系 小马哥带你答疑解惑 1 首先我们可以创建一个空表单 在这个表单里面不用放任何东西 2 然后我
  • selenium自动化环境搭建(Windows)

    一 selenium介绍 selenium主要用于web应用程序的自动化测试 还支持所有基于web的管理任务自动化 selenium经历了2个版本 selenium1 0和selenium2 0 selenium不是一个单独的工具 而是由一
  • 如何对Docker容器进行健康检查

    如何对 Docker 容器进行健康检查 熟悉使用过kubernetes的人应该知道 kubernetes支持对pod进行健康检查的功能 这对生产业务来说其实是非常有用处的 能快速发现服务不可用 并进行快速重启恢复 其实不使用kubernet
  • 局域网设备查找和发现,局域网软件在线更新,Qt udp组播

    使用udp组播原因 想要实现查找局域网自己的设备 但是不知道存在设备的ip 局域网软件在线更新 不想固定服务器的ip地址 因为是开发人员电脑 ip可能随时在变化 比较了广播 组播的优缺点 最终选择组播 组播优点 组播技术的初衷是在IP网络中
  • C++14新特性

    C 14 维基百科 C 14是C 的现行标准的非正式名称 正式名称为 International Standard ISO IEC 14882 2014 E Programming Language C C 14旨在作为C 11的一个小扩展