Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dec to 17ную, Перевести из десятичной в 17чную систему 
:(
    Опции темы
azesmcar
Дата 25.7.2009, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  25.7.2009,  10:12 Найти цитируемый пост)
польза есть. иначе пустую спецификацию исключений не использовали бы в бусте.

Да, это единственный вид спецификации исключений которые можно использовать, но это может повлиять на производительность программы, так как некоторые компиляторы могут не встраивать функции со спецификацией исключений.
Цитата(Herb Sutter)

Moral #1: Never write an exception specification.
Moral #2: Except possibly an empty one, but if I were you I’d avoid even that.


PM   Вверх
Gordon
Дата 25.7.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Цитата(Леопольд @  25.7.2009,  11:05 Найти цитируемый пост)
Присваивание лишнее, конструктор по умолчанию делает пустую строку


Делает, но с присваиванием более наглядно, хотя...


--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Gordon @ 25.7.2009,  10:22)
Делает, но с присваиванием более наглядно, хотя...

Это вызов лишней функции std::string::operator= (char*)
Я ещё заменил все s = char + s на s += char, по тем же соображениям, так намного быстрее.

ещё можно s.reserve(x) добавить после объявления переменной s.

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 10:33


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Цитата(Леопольд @  25.7.2009,  11:31 Найти цитируемый пост)
Я ещё заменил все s = char + s на s += char, по тем же соображениям, так намного быстрее.


Код

s = char + s;


и

Код

s += char;


немного разные вещи...   smile 
А так спасибо за замечания!  smile

Добавлено через 5 минут и 50 секунд
Цитата(Леопольд @  25.7.2009,  11:31 Найти цитируемый пост)
Это вызов лишней функции std::string::operator= (char*)



Леопольд, а 100% будет вызыватья std::string::operator= (char*)?

Добавлено через 11 минут и 12 секунд
Допустим, такой класс:

Код

class A
{
    public:
        A() : i() { cout << "A()" << endl; }
        A(int n) : i(n) { cout << "A(int)" << endl; }
        ~A() { cout << "~A()" << endl; }
        A& operator =(const A &a)
        {
            cout << "operator =" << endl;
            this->i = a.i;
            return *this;
        }
    private:
        int i;
};


потои я создаю объекты:
Код

A a = 5;
A a1(5);


оба раза вызывается "A(int)", т.е. может там компилятор что-то вроде оптимизации проводит?
p.s. с типом std::string так же, или нет?


--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Gordon @ 25.7.2009,  10:40)
немного разные вещи...   smile

Не за что smile

Я бы даже сказал что это совсем разные вещи  smile 
В одном случае вызывается встраиваемая функция для добавления в конец строки, которая, возможно, должна быть увеличена в размерах, но совсем не обязательно. Где-то отложилось в памяти что по умолчанию на любую строку выделяется что-то вроде 32 символов. 
В другом, конструируется новая копия строки, в которую помещается результат конкатенации символа и строки, причём всё в строке должно быть сдвинуто вправо. После этого эта копия присваивается аккумулирующей строке.

Ещё есть бага в функции, связанная с тем что наименьшая система счисления двоичная. Эта бага может привести к бесконечному циклу, или делению на ноль  smile

Добавлено @ 10:59
Цитата(Gordon @ 25.7.2009,  10:40)
оба раза вызывается "A(int)", т.е. может там компилятор что-то вроде оптимизации проводит?
p.s. с типом std::string так же, или нет?

Я ошибся!  smile Читал ведь, давно, у Страутрупа что type x(val); и type x = val; одно и тоже. Но недавно где-то прочёл (или неправильно понял) что это не так. Последнее запомнилось больше... smile А вообще, что бы не думалось, можно сделать так
std::string s("init string");

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 11:07


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 25.7.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Gordon @  25.7.2009,  10:40 Найти цитируемый пост)
оба раза вызывается "A(int)", т.е. может там компилятор что-то вроде оптимизации проводит?

в первом случае вызывается конструктор преобразования  A(int n). все конструкторы с одним параметром - конструкторы преобразования.
во-втором случае вы явно вызываете конструктор с одним параметром.
***
сделайте конструктор явным и увидите ошибку. 
Код

explicit A(int n)


Это сообщение отредактировал(а) zim22 - 25.7.2009, 11:03


--------------------
PM MAIL   Вверх
Леопольд
Дата 25.7.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(zim22 @ 25.7.2009,  11:01)
в первом случае вызывается конструктор преобразования  A(int n). все конструкторы с одним параметром - конструкторы преобразования.
***
Код

explicit A(int n)

Это один и тот же конструктор, квалификатор explicit просто запрещает использовать его для неявных преобразований. Соответственно его нельзя будет вызвать таким синтаксисом type x = val;

Код

struct S{
    explicit S(int) {}
    explicit S(S&) {}
};

int main(void){
    S s1(1);  // ОК
    S s2(s1);// ОК

    S s3 = 1;  // error
    S s4 = s1;// error в конструкторе копирования
    return 0;
}

Думаю, это уже достаточно веская причина для инициализации в скобках а не при помощи =

Это сообщение отредактировал(а) Леопольд - 25.7.2009, 11:14


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 25.7.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Леопольд @  25.7.2009,  11:06 Найти цитируемый пост)
Это один и тот же конструктор,

ну да. один и тот же. 
в-первом случае он вызывается неявно
во-втором - явно.
Цитата(Леопольд @  25.7.2009,  10:52 Найти цитируемый пост)
Я ошибся! Читал ведь, давно, у Страутрупа что type x(val); и type x = val; одно и тоже

это разные вещи. 
Код

int i(10); // прямая инициализация
int i = 10; // инициализация копии

Язык С++ поддерживает две формы инициализации переменных: инициализация копии( copy-initialization) и прямая инициализация(direct-initialization).
различия между ними в том, что в случае инициализации копии больше накладных расходов. сначала создаётся временный объект, потом идёт присвоение результату. Кроме того прямая инициализация гибче, т.к. можно указать любое количество параметров конструктора.



--------------------
PM MAIL   Вверх
Леопольд
Дата 25.7.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(zim22 @ 25.7.2009,  11:13)
различия между ними в том, что в случае инициализации копии больше накладных расходов. сначала создаётся временный объект, потом идёт присвоение результату.

В обоих случаях выполняется один и тот же код. Если для инициализации нужен временный объект, то он будет создан в обоих случаях. Но вариант с = запрещён, если использовать explicit.


Код

struct S{
    int j;
    S(int i): j(i) {}
};

 int main(){
    S s1(1);
    S s2 = 1;
 }

Код

0x401059    lea    rdi,[rbp-0x10]
0x40105d    mov    esi,0x1
0x401062    call   0x401538 <S>
0x401067    lea    rdi,[rbp-0x20]
0x40106b    mov    esi,0x1
0x401070    call   0x401538 <S>


Это сообщение отредактировал(а) Леопольд - 25.7.2009, 11:25


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Цитата(zim22 @  25.7.2009,  12:13 Найти цитируемый пост)
Язык С++ поддерживает две формы инициализации переменных: инициализация копии( copy-initialization) и прямая инициализация(direct-initialization).различия между ними в том, что в случае инициализации копии больше накладных расходов. сначала создаётся временный объект, потом идёт присвоение результату. Кроме того прямая инициализация гибче, т.к. можно указать любое количество параметров конструктора.


Ну это да! А explicit запрещает неявные вызовы конструктора.
Мне интересно, может ли компилятор это - "int i = 10;", заменить int i(10); ?


--------------------

  
     
PM MAIL WWW   Вверх
Леопольд
Дата 25.7.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(Gordon @ 25.7.2009,  11:29)
Ну это да! А explicit запрещает неявные вызовы конструктора.
Мне интересно, может ли компилятор это - "int i = 10;", заменить int i(10); ?

Именно так он и сделает, если нет explicit.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Цитата(Леопольд @  25.7.2009,  12:30 Найти цитируемый пост)
Именно так он и сделает, если нет explicit.


int i(10); // прямая инициализация
int i = 10; // инициализация копии

имеют одинаковую эффективность, так?


--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 25.7.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Gordon @  25.7.2009,  11:41 Найти цитируемый пост)
имеют одинаковую эффективность, так?

Цитата(Леопольд @  25.7.2009,  11:18 Найти цитируемый пост)
В обоих случаях выполняется один и тот же код. 

для встроенных типов данных - да. для классов - нет.
для классов прямая инициализация быстрей. т.к. копия не создаётся. smile
***
Цитата(Леопольд @  25.7.2009,  11:18 Найти цитируемый пост)
Но вариант с = запрещён, если использовать explicit.

разрешён.
Код

S s1 = S(10);


Это сообщение отредактировал(а) zim22 - 25.7.2009, 12:02


--------------------
PM MAIL   Вверх
Gordon
Дата 25.7.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Цитата(zim22 @  25.7.2009,  12:46 Найти цитируемый пост)
для классов прямая инициализация быстрей. т.к. копия не создаётся. 


zim22, а чем эта копия потом присваивается объявляемому объекту, я пробовал operator = и конструктор копирования делать закрытыми, и все равно код работал...

Это сообщение отредактировал(а) Gordon - 25.7.2009, 11:56


--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 25.7.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Gordon @  25.7.2009,  11:53 Найти цитируемый пост)
, а чем эта копия потом присваивается объявляемому объекту,

Код

struct S{
    int j;
    S(int i): j(i) {}
    S(const S &rhs) : j(rhs.j) { }
};

S s1 = 10;
S s2 = s1;



--------------------
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.