在所有 Solaris 平台和不支持 64 位的 Linux 平台上,ILP32 内存模型(32 位 int、long、pointer 数据类型)是缺省值。在启用了 64 位的 Linux 平台上缺省为 LP64 内存模型(64 位 long 和指针数据类型)。-m64 仅允许在支持 LP64 模型的平台上使用。
包含-fsimple=1 的所有功能,当 -xvector=simd 生效时,还允许使用 SIMD 指令计算约简。 编译器尝试主动浮点优化,这可能导致很多程序因舍入更改而产生不同数值结果。例如,-fsimple=2 允许优化器将给定循环中 x/y 的所有计算都替换为 x*z,其中保证在循环中至少对 x/y 进行一次求值,z=1/y,并且已知 y 和z...
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。 列表初始化 int var{0}; 作为C++11标准的一部分,用花括号来初始化变量得到了全面应用——列表初始化(list initialization)。当用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使...
访问string对象的下标运算符([])接受的输入参数是string::size_type类型的值,这个参数表示要访问的字符的位置;返回值是该位置上字符的引用。 初始化vector对象的方法 初始化过程会尽可能地把花括号内的值当成是元素初始值的列表来处理,只有在无法执行列表初始化时才会考虑其他初始化方式。(例:vector<string> v1{10...
常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改; 修饰成员函数,说明该成员函数内不能修改成员变量。 使用 const 使用 // 类 class A { private: const int a; // 常对象成员,只能在初始化列表赋值 public: // 构造函数 A() : a(0) { }; ...
从代码可以看出这样的实现很难读懂;采用宏实现无法进行类型检查,加大了调试难度;使用不自然,容易出错。象上面 C 中的链表操作要求用户定义的类型中嵌入链表结构,这违反了信息封装的原则,同时使用不方便,因此程序员希望 C 能提供自然、通用的容器,这些容器能容纳用户定义的类型,并提供各种操作,而不需要强制用户定义的...
指向常量的引用(reference to const) 没有const reference,因为引用本身就是 const pointer (为了方便记忆可以想成)被 const 修饰(在 const 后面)的值不可改变,如下文使用例子中的 p2、p3。 使用 // 类 class A { private: const int a; // 常对象成员,只能在初始化列表赋值 ...
非类型模板参数 现在会在提供显式模板参数时准确检查包含非类型模板参数的某些代码的类型符合性。 例如,在早期版本的 Visual Studio 中正确编译的以下代码。 C++ 复制 struct S1 { void f(int); void f(int, int); }; struct S2 { template <class C, void (C::*Function)(int) const> void f()...
非类型模板参数 现在会在提供显式模板参数时准确检查包含非类型模板参数的某些代码的类型符合性。 例如,在早期版本的 Visual Studio 中正确编译的以下代码。 C++ 复制 struct S1 { void f(int); void f(int, int); }; struct S2 { template <class C, void (C::*Function)(int) const> void f() {...
这也是 C++中更加推荐使用 vector 而不是 C 风格数组的原因。 类型说明符 类型不是从左向右说明 C/C++中的类型说明符其实设计得很不合理,除了最简单的变量定义: 上面这个还是很清晰明了的,但稍微复杂一点的,就比较奇怪了: arr 明明是类型,但是这里的 int 和[5]却并没有写到一起,如果这个还不算很容易造成...