Лучшая практика для обработки данных класса const

Скажем, у вас есть определенный класс, в котором каждый его экземпляр должен обращаться к одному и тому же набору данных. Более эффективно объявлять данные вне класса, а не создавать каждый экземпляр самостоятельно, но не нарушает ли это правило «отсутствия глобальных переменных»?

Пример кода:

foo.h

class Foo{
Foo();
void someFunction();
};

foo.cpp

#include "Foo.h"
//surely ok since it's only global to the class's .cpp?
const int g_data[length] = {
//contains some data
};

Foo::someFunction(){
//do something involving g_data ..
}

..вместо того, чтобы делать g_data переменной-членом. Или есть какой-то другой способ, который избегает создания глобального?

1

Решение

Используйте модификатор static который изменяет объявление члена класса так, чтобы оно было общим для всех экземпляров класса. Пример:

class A {
int length = 10;
static int g_data[length]; //Inside the class
}

И тогда вы можете получить к нему доступ, как это:

int main(void) {
std::cout << "For example: " << A::g_data[2] << std::endl;
}

Вы можете найти больше по этому вопросу Вот

3

Другие решения

Вот что статический член для.

Таким образом, вы будете иметь в своем заявлении:

class Foo{
Foo();
void someFunction();
static int const sharedData[length];
};

И где-то в вашем файле cpp:

int const Foo::sharedData[length] = { /* Your data */ };
2

В общем, да — ваш «глобальный», вероятно, в порядке (хотя было бы лучше в анонимном пространстве имен, и есть несколько соображений).

Подробности: много ответов, рекомендующих static Ученик, и это часто хороший путь, но имейте в виду, что:

  • static член класса должен быть указан в определении класса, так что в вашем случае он будет в Foo.h, и любой клиентский код, содержащий этот заголовок, вероятно, захочет перекомпилировать, если вы отредактируете static участвовать любым способом, даже если он является частным и не имеет прямого отношения к ним (это наиболее важно для классов в низкоуровневых библиотеках с разнообразным клиентским кодом — корпоративных библиотеках и библиотеках общего пользования, используемых крупными клиентскими приложениями)

  • с static член класса, код в заголовке имеет возможность использовать его (в этом случае перекомпиляция будет необходима и целесообразна, если static изменения участника)

  • если вы помещаете данные в файл .cpp, то лучше всего в анонимном пространстве имен, поэтому они не имеют внешней связи (другие объекты не видят ее или не могут ссылаться на нее), хотя у вас нет способа инкапсулировать ее, чтобы защитить от доступ к другим функциям позже в модуле перевода .cpp (тогда как непубличный static у ученика есть такая защита)

1

Что вы действительно хотите, так это данные, принадлежащие тип, не для пример этого типа. К счастью, в C ++ есть инструмент, который делает именно это — статический ученики

0

Если вы хотите избежать глобального и иметь более объектно-ориентированное решение, взгляните на Мухи. Boost Flyweight библиотека имеет некоторую вспомогательную инфраструктуру и дает достойное объяснение концепции.

Поскольку вы говорите об эффективности, может быть хорошей идеей использовать такой подход, в зависимости от вашей реальной цели. Flyweights больше заботятся о сохранении памяти и предоставляют дополнительный уровень косвенности, который может повлиять на производительность во время выполнения. Внешне хранимое состояние может повлиять на оптимизацию компилятора, особенно встраивание и уменьшить локальность данных, что мешает эффективному кешированию. С другой стороны, некоторые операции, такие как присвоение или копирование, могут быть значительно быстрее, потому что существует только указатель на общее состояние, которое необходимо скопировать (плюс нераспределенное состояние, но это должно быть скопировано в любом случае). Как всегда, когда дело доходит до эффективности / производительности, убедитесь, что вы измеряете свой код, чтобы сравнить то, что соответствует вашим требованиям.

0
По вопросам рекламы [email protected]