Эффективность явной инициализации - PullRequest
1 голос
/ 24 августа 2010

У меня есть класс, у которого есть конструктор, который принимает 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*. Стоит ли делать перегрузку для скорости или влияние на производительность настолько мало, что перегрузка является пустой тратой пространства? Я пытаюсь сделать свою программу максимально быстрой, поэтому скорость является важным фактором, равно как и размер, но не так много.

Ответы [ 4 ]

1 голос
/ 24 августа 2010

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

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

0 голосов
/ 24 августа 2010

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

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

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

0 голосов
/ 24 августа 2010

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

0 голосов
/ 24 августа 2010

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

...