GNU C++ 编译器 g++ 为 C++ 语言提供了扩展。这两个选项之间的区别在于是否启用这些可能违反 C++ 标准的 GNU 扩展。请注意,即使使用 -std = c++11,某些扩展仍然可能有效,前提是它们不违反标准。GNU 编译器中 C++ 语言扩展的列表可以在这里找到 - https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html
简而言之,placement new 允许您在已分配给给定变量的内存上“构造”一个对象。这对于优化很有用,因为它比重新分配和重用已分配给它的相同内存更快。它可以按如下方式使用 -new (address) (type) initializer我们可以指定一个地址,我们希望在该地址处构造给定类型的新的对象。示例#include using namespace std; int main() { int a = 5; cout
三法则是在使用 C++ 时的一条经验法则。这是一种良好的实践规则,它指出如果您的类需要任何一个复制构造函数、赋值运算符或析构函数显式定义,那么它可能需要所有三个。为什么?这是因为,如果您的类需要任何上述内容,它将管理动态分配的资源,并且可能需要其他资源来成功实现这一目标。例如,如果您需要一个赋值运算符,您将创建当前通过引用复制的对象的副本,从而分配... 阅读更多
Scott Meyers 在 Effective C++ 中说 -如果一个类有任何虚函数,它应该有一个虚析构函数,并且那些未设计为基类或未设计为用于多态性的类不应该声明虚析构函数。因此,您应该在多态基类中声明析构函数为虚函数。这是因为,如果您使用派生构造函数创建基类的对象 -Base *b = new Derived(); // 使用 b delete b;如果 Base 的析构函数不是虚函数,那么在这种情况下,delete b 的行为未定义。对析构函数的调用将像任何非虚代码一样解析。... 阅读更多