包含在许多翻译单元中的静态常量的开销?

Ann*_*inn 6 c++ static header constants

在头文件中,可以在一行中声明和(预)定义全局常量.

// constants.h
namespace Constant{
    static const unsigned int framerate = 60;
    static const char * const windowName = "Test";
    static const unsigned char * const cursorBitmap = { lots of data };
}
Run Code Online (Sandbox Code Playgroud)

我喜欢这种格式,因为它允许我将常量保存在一个位置,并且避免需要在一个文件中声明常量并在另一个文件中定义它,这有助于提高可读性.constants.h但是,当任何翻译单元包括时,它会按单位扩展这些定义.

我的问题是,如果我包含constants.h在许多翻译单元中,这会导致显着的开销,例如,cursorBitmap其他数组常量是否非常大?如果我将它包含在100个单元中,我的程序是否包含每个字符串和数组文字的100个副本?或者只会复制指针和值?

如果有开销,有没有办法可以避免它而不需要单独声明和定义?

(我也猜测'静态'在这个用法中是多余的,但我还是喜欢把它放在那里)

Che*_*Alf 3

字符串文字在各个翻译单元中是否重复是一个实施质量问题。

直接声明的对象将在包含此标头的每个翻译单元中复制。不过这并不多。并且在未直接或间接使用某些常量地址的翻译单元中,它可能会被优化掉。

如果你想确保每个常量只有一份副本,甚至没有副本,那么你可以使用类模板,如下所示:

常量.h
#pragma once

template< class Dummy >
struct Constant_{
    static const unsigned int framerate;
    static const char * const windowName;
    static const unsigned char * const cursorBitmap;
};

template< class Dummy >
const unsigned int Constant_<Dummy>::framerate = 60;

template< class Dummy >
const char * const Constant_<Dummy::windowName = "Test";

template< class Dummy >
const unsigned char * const Constant_<Dummy>::cursorBitmap = ...;

using Constant = Constant_<void>;
Run Code Online (Sandbox Code Playgroud)

但恕我直言,这比它的价值更多的工作。

一种类似的替代方法是使用inline函数,每个常量对应一个函数。