【问题标题】:Force c++ compiler to warn about all stack instances of an object强制 c++ 编译器警告对象的所有堆栈实例
【发布时间】:2023-03-24 18:48:01
【问题描述】:

我想重构一个大型代码库以进行优化,向前推进,我想防止堆栈使用类类型。例如:

class noStack
{
    int x;
    // I don't want this on the stack
};

void foo()
{
    noStack bar; // I want the compiler to issue a warning here.

    class moreNoStack { int a; noStack b; }

    moreNoStack baz; // Also warn here because baz is on the stack and contains a noStack
}

但另一方面,我希望编译器忽略这一点:

noStack g_globalNoStack; // no warning

class foo
{
    noStack bar; // no warning
};

foo g_globalFoo; // no warning

void func()
{
    foo* p = (foo*)malloc(sizeof(foo)); // no warning
    foo* q = new foo; // no warning
}

另一方面,如果没有办法让编译器做到这一点,那么我可以反过来吗?意思是不要警告堆栈的使用,但总是警告全局实例或包含的类成员?无论哪种方式我都可以解决这个问题。

【问题讨论】:

  • 我认为任何已知的编译器都不存在这样的编译器选项。除此之外,这听起来是一个非常糟糕的主意,它只会帮助引入错误,但对性能没有帮助。
  • 您是否了解您的malloc 行与下面的new相同?
  • 我建议你研究 C++ 的 静态分析器
  • @deviantfan,是的,但我不在乎这种情况。
  • 我注意到你用simd 标记了这个。您是否实际上试图确保您的班级正确对齐?如果是这样,有更好的方法来做到这一点,使用编译器特定的对齐属性。

标签: c++ optimization stack compiler-warnings simd


【解决方案1】:

除了在编译器中实现它之外,没有办法强制编译器生成警告。我会使用clang-tidy并将其与CI系统集成。这是一个关于clang-tidy的简单教程: http://bbannier.github.io/blog/2015/05/02/Writing-a-basic-clang-static-analysis-check.html

【讨论】:

  • 谢谢。如果我们移植到clang,这在表面上似乎是可行的。不过,就目前而言,我认为这不会发生。
【解决方案2】:

您可以通过将类构造函数设为私有,然后创建类静态或免费友元工厂函数来为您构造实例来做到这一点。

工厂函数总是在堆上分配并返回一个指针(最好是智能指针)。

然后,您将在代码尝试构造类实例的任何地方收到错误消息,您可以修复它们以改用工厂函数。而且由于没有其他方法可以构造对象,因此您可以确保所有实例都分配在堆上。

您还可以为这些对象创建一个专门的内存池。如果它们异常大或奇怪,这可能有助于减少碎片。

【讨论】:

  • 谢谢,但这根本不是我想要的。我想允许在对象作为包含的成员变量或全局存在但不在函数范围内的任何地方进行构造。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2019-05-12
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
相关资源
最近更新 更多