2010-08-24 3 views
1

У меня есть класс, который имеет конструктор, который принимает const char*. Это:Эффективность явной инициализации

c::c(const char* str) { 
    a = 32; 
    f = 0; 
    data = new char[strlen(str)]; 
    memcpy(data, str, strlen(str)); 
} 

И функция, которая принимает один из них:

int foo(c& cinst); 

Вы можете вызвать эту функцию либо передавая ему экземпляр c:

c cinst("asdf"); 
foo(cinst); 

или, потому что у нас есть явная инициализация, вы можете сделать:

foo("asdf"); 

, который сделает c, передав конструктор «asdf», а затем передаст результирующий объект foo.

Однако, похоже, что это может быть немного менее эффективно, чем просто перегрузка foo, чтобы взять const char*. Стоит ли перегружать скорость или это влияние на производительность настолько мало, что это пустая трата пространства, чтобы сделать перегрузку? Я пытаюсь сделать свою программу как можно быстрее, поэтому скорость - важный фактор, так что размер, но не так много.

+0

Вы не копируете терминатор '\ 0', что, скорее всего, является ошибкой.Кроме того, вы вызываете 'strlen' дважды, что противоречит вашей цели быть как можно быстрее;) Я предлагаю следующее:' data = new char [strlen (str) + 1]; strcpy (data, str); '. – fredoverflow

+1

Вы когда-нибудь слышали о Шлемиеле Художнике? Google для этого :) После этого посмотрите на свои вызовы на 'strlen' –

+1

@Mac: вызов' strlen' дважды не так уж плох, как вызов его n раз;) – fredoverflow

ответ

1

Что будет foo делать с этим const char*? Если он просто сделает свой собственный объект c, тогда нет смысла.

Если он собирается использовать char* непосредственно (и существующий foo просто вытащил char* из-за c объекта), то было бы лучше, чтобы написать перегрузку.

+0

Точно ответ, который мне нужен. –

0

Это не займет нулевого времени, поэтому это один из компромиссов, которые вы должны предпринять, скорость и ясность api. Конечно, это будет зависеть от того, что вы делаете в своей функции, которая принимает const char *, вы строите объект c? В этом случае просто предложите функцию с интерфейсом класса c.

0

На этот вопрос лучше всего ответить с помощью профилировщика. Глядя на код ассемблера, он может также дать ключ.

0

Это ситуационная ситуация. Это действительно зависит от того, сколько действительно происходит внутри конструктора в данной ситуации и сколько раз этот код фактически выполняется.

В примере, который вы даете, это довольно тривиальные операции в этом конструкторе. На любом разумном современном процессоре эти операции будут очень быстрыми. Поэтому, если этот код не выполняется огромное количество раз в секунду и более, я бы даже не беспокоился об этом. (Разумеется, значение «огромного» зависит от того, на какой машине вы будете запускать это. Для этого конструктора, на обычном настольном процессоре, я даже не стал бы волноваться, пока он не встанет в шкалу как минимум сотни тысяч раз в секунду.)

Если этот код конструкции запускается несколько раз, то вы все равно должны его профилировать и точно определить, имеет ли он заметное влияние по сравнению со всем остальным, что происходит в вашей программе. Оптимизация - сложная вещь. Иногда то, что говорит ваше чувство кишки, неэффективно, на самом деле мало влияет на конечные результаты. Измерение всегда направлено на то, чтобы определить, где вы действительно должны тратить свое время, чтобы наиболее эффективно заставить вашу программу работать быстрее.

Смежные вопросы