Как правило, если вам нужен параметр IN, передавайте встроенные типы по значению, а другие типы по ссылке на const
, т. е.
template< size_t size >
void function( Container<size> const& input,size_t Size )
{
//all instances do exactly same thing and with regard to Size that determines the size of object
}
С этим определением есть вероятность, что компилятор + компоновщик оптимизируют все так, что будет только одна версия машинного кода function
.
Я был немного удивлен, когда впервые проверил простую маленькую программу-пример, что ее выражение с полиморфизмом времени компиляции (шаблоном) дает меньший и более эффективный код, чем его выражение с полиморфизмом времени выполнения!
Попробуйте сами, и если вы так же удивлены, как когда-то был я, то хорошо! В противном случае, скорее всего, не будет существенной разницы. Но в некоторых крайних случаях вы можете обнаружить то, что в старые времена называлось «раздуванием шаблонного кода», и тогда пришло время игнорировать это или измерить, достаточно ли это важно, чтобы выполнить работу по переводу полиморфизма времени выполнения.
Теперь на ваш вопрос,
«Мне любопытно, что единственная функция, которая принимает параметр переменного размера, как указано выше, который не разрешен C++, является чем-то, что вообще невозможно реализовать и сгенерировать сборку, или каким-то образом приводит к неэффективной реализации с точки зрения скорости/памяти?»
Нет, нет ничего невозможного в том, чтобы преобразовать полиморфизм времени компиляции в эффективный полиморфизм времени выполнения или просто в отсутствие полиморфизма. Тем более, что вы уже передаете размер времени выполнения (который, по-видимому, гарантированно меньше фиксированного размера).
Безопасный способ — использовать std::string
из стандартной библиотеки C++, заголовок <string>
. Это включает в себя динамическое выделение где-то внутри std::string
, которое выполняется автоматически для вас, но влияет на эффективность. Но ваш код, содержащий char[size] characters
, не был допустимым C++, и это указывает на начальный уровень, поэтому есть вероятность, что ваш дизайн не был выбран по какой-либо веской причине, поэтому сделайте:
class Container
{
public:
std::string characters;
};
void function( Container const& input )
{
// whatever, using e.g. input.characters.length()
}
Ура и чт.,
person
Cheers and hth. - Alf
schedule
19.11.2010
size
вашей функции?Container<size>
уже имеет эту информацию. - person ereOn   schedule 19.11.2010