C++ 力c++;编译器警告对象的所有堆栈实例

C++ 力c++;编译器警告对象的所有堆栈实例,c++,optimization,stack,compiler-warnings,simd,C++,Optimization,Stack,Compiler Warnings,Simd,我想重构一个大型的代码库以达到优化的目的,接下来,我想防止类类型的堆栈使用。例如: 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

我想重构一个大型的代码库以达到优化的目的,接下来,我想防止类类型的堆栈使用。例如:

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
}

另一方面,如果没有办法让编译器这样做,那么我可以换个方式吗?意思是不警告堆栈使用情况,但总是警告全局实例或包含的类成员?我可以用任何一种方法来解决这个问题。

除了在编译器中实现警告之外,没有其他方法可以强制编译器生成警告。我将使用的是clang tidy并将其与CI系统集成。以下是关于clang tidy的简单教程:

除了在编译器中实现警告之外,没有办法强制编译器生成警告。我将使用的是clang tidy并将其与CI系统集成。以下是关于clang tidy的简单教程:

您可以通过将类构造函数设置为私有,然后创建类静态或自由友元工厂函数来为您构造实例来实现这一点

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

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


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

您可以通过将类构造函数设置为私有,然后创建一个类静态或自由友元工厂函数来为您构造实例来实现这一点

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

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


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

我认为任何已知的编译器都不存在这样的编译器选项。与此无关,这听起来是一个非常糟糕的想法,它只帮助引入错误,但不利于性能。你知道你的<代码> MalcC 行与下面的<代码>新< /COD>行不一样吗?我建议你研究C++的静态分析器。但我不关心这个问题。我注意到您用
simd
标记了它。你是否真的在努力确保你的课程正确地对齐?如果是这样,有更好的方法可以做到这一点,使用编译器特定的对齐属性。我认为任何已知的编译器都不存在这样的编译器选项。与此无关,这听起来是一个非常糟糕的想法,它只帮助引入错误,但不利于性能。你知道你的<代码> MalcC 行与下面的<代码>新< /COD>行不一样吗?我建议你研究C++的静态分析器。但我不关心这个问题。我注意到您用
simd
标记了它。你是否真的在努力确保你的课程正确地对齐?如果是这样的话,有更好的方法可以做到这一点,使用编译器特定的对齐属性。谢谢,但这根本不是我想要的。我想允许在对象作为包含的成员变量或全局变量存在的任何位置进行构造,但不在函数中定义范围。谢谢,但这根本不是我想要的。我想允许在对象作为包含的成员变量或全局变量存在的任何位置进行构造,但不在函数内进行构造。谢谢。这在表面上似乎是可行的道路,如果我们曾经港口到叮当声。不过就目前而言,我认为这不会发生。谢谢。这在表面上似乎是可行的道路,如果我们曾经港口到叮当声。不过,就目前而言,我认为这不会发生。