Как стать автором
Обновить

Комментарии 11

Я оставлю бесконечный цикл в конструкторе по одной причине:

не нужно гордиться незнанием C++. если тебе в классе нужен всего один метод, то подумай нужен ли тебе класс.
всего того же самого но без сайд эффектов можно добиться засунув цикл в статическую функцию класса и вызывать его допустим так
Server::Run()
Я очень мало знаю о этой теме, но не раз слышал, что в подобных ситуациях использовать select в windows — не самая лучшая идея. Вот, напрмер, тут написано почему.
Я продолжу писать код в заголовочных файлах по ряду причин:…
Те кто уверен, что так как я делать нельзя — можете поучить программированию создателей stl и boost сначала, а потом переименовать файл server.h в server.cpp и будет всем хорошо…

Если весь код можно писать в заголовках, зачем необходимо линковать программы, использующие stl, с libstdc++.so?
>Я не буду использовать std::copy вместо memcpy по одной причине: std::copy — тормоз!
Да вы издеваетесь! Подсказка: компилятор генерирует *абсолютно* одинаковый код.

Скрытый текст
#include <algorithm>
#include <cstring>

void f(char *dst, const char *src, size_t length) {
    std::copy(src, src + length, dst);
}

void g(char *dst, const char *src, size_t length) {
    std::memcpy(dst, src, length);
}


/tmp/tmpi3vn0y.o:     file format elf64-x86-64-freebsd

Disassembly of section .text:

0000000000000000 <_Z1fPcPKcm>:
   0:   55                      push   rbp
   1:   48 89 e5                mov    rbp,rsp
   4:   e8 00 00 00 00          call   9 <_Z1fPcPKcm+0x9>
   9:   5d                      pop    rbp
   a:   c3                      ret
   b:   0f 1f 44 00 00          nop    DWORD PTR [rax+rax+0x0]

0000000000000010 <_Z1gPcPKcm>:
  10:   55                      push   rbp
  11:   48 89 e5                mov    rbp,rsp
  14:   e8 00 00 00 00          call   19 <_Z1gPcPKcm+0x9>
  19:   5d                      pop    rbp
  1a:   c3                      ret

Согласен, погорячился. Разница есть, но она видна не в самих функциях copy и memcpy, а при задании их аргументов.
С++
int main()
{
	std::vector<unsigned char> v1(10), v2(10);

	for (int n=0; n<v1.size(); n++)
	{
		v1[n] = n;
	}

	std::copy(&v2[0], &v2[v2.size() - 1], &v1[0]);
	memcpy(&v2[0], &v1[0], v2.size());

	return 0;
}


Ассемблер:

	std::copy(&v2[0], &v2[v2.size() - 1], &v1[0]);
01371088  mov         ebx,dword ptr [v2]  
0137108B  mov         esi,dword ptr [ebp-24h]  
0137108E  sub         esi,ebx  
01371090  lea         eax,[esi-1]  
01371093  push        eax  
01371094  push        ebx  
01371095  push        edi  
01371096  call        dword ptr ds:[13720A0h]  
	memcpy(&v2[0], &v1[0], v2.size());
0137109C  push        esi  
0137109D  push        edi  
0137109E  push        ebx  
0137109F  call        _memcpy (01371AAAh)  


Пожалуй не такой уж std::copy тормоз, подумаю еще раз над ее использованием )

Скажу сразу: весь исходник вашего проекта и статьи целиком не читал, но пробежал глазами.
Меня всегда радуют люди, которые пытаются развиваться. Самоустремлённость — отличное качество человека. Желаю вам не останавливаться.
Радует и то, что вы прислушиваетесь к критике. Проект сразу собрался под Linux указанной вами строкой.

Теперь вопросы.

  1. Планируете ли добавить кросплатформенную систему сборки (к примеру, CMake)? Ведь кросплатформенность одних только исходников ущемляет возможности пользователей ОС, отличных от вашей.
    Плюсы:
    • Для вас: новый полезный инструмент
    • Для других: компиляция одной-двумя привычными командами вместо копирования строки gcc, разрастающейся с ростом проекта
    • Для всех: никаких сложностей при развитии проекта

  2. Планируете ли использовать систему контроля версий? Будет проще отслеживать изменения, делиться исходными кодами и управлять проектом.
  3. Будете ли включать предупреждения компилятора? Смотрите, сколько дефектов (потенциально — багов) я нашёл в коде, всего лишь добавив при компиляции флаги "-Wall -Werror":
    • server.h:77:8: error: `server::CClient::m_pSSL` will be initialized after
      в списке инициализации m_pSSL должно стоять после m_pSSLContext, поскольку оно объявлено ниже в классе. Причина, по которой вам это может быть полезным.
    • server.h:300:45: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
           if (strInputString.find("\r\n\r\n") != -1)
      
      string::find возвращает не -1 в случае отсутствия элемента, а string::npos.
    • ./server.h:446:10: error: logical not is only applied to the left hand side of this comparison [-Werror,-Wlogical-not-parentheses]
                                              if (!m_events[i].events == EPOLLIN)
      

      (выдаёт Clang) возможно, вы хотели написать
      if (m_events[i].events != EPOLLIN)

    • пачка предупреждений о том, что const для возвращаемых значений RETCODES не обязателен.

  4. Недопонял, что делают строки вида "#define EPOLLIN EPOLLIN". Можете пояснить?
  5. Ну и придирки по стилю: избавление от «using namspace std;» и «printf» улучшит вашу карму (Человеческую, не хабрахабровую. Хотя, кто знает?) и сделает код более единообразным.

Спасибо за статьи.
Спасибо за подробный и объективный комментарий.
Попробую ответить в меру своих компетенций.

Q: Планируете ли добавить кросплатформенную систему сборки (к примеру, CMake)?
A: В принципе да, но пока нет. Объясню почему:
во-первых, моей основной средой разработки является Visual Studio, по этой причине я очень мало знаю про инструменты разработчиков под Linux и другие платформы. Я несколько раз пытался осилить make, но всякий раз ловил себя на мысли, что не понимаю: «кто и зачем это придумал и кому это нужно».
Ну правда: мне до сих пор всегда в линуксе хватало создать исполняемый файл с именем «compile» и написать в него:
#!/bin/sh
g++ ...
rm *.o *.gch ...

Но, повторюсь, когда я осознаю необходимость CMake, то постараюсь его добавить.

Q:Планируете ли использовать систему контроля версий?
A:Серьезно над этим думаю в настоящее время. Не могу определиться с репозиторием: когда-то пользовался sourceforge, в последнее время много вижу ссылок на github.
Для меня главные критерии: простой неглючный клиент для Windows и поддержка русского языка (у sourceforge с этим вроде были проблемы).

Q:Будете ли включать предупреждения компилятора?
A:Спасибо, за найденные ошибки. Буду исправлять.
Предупреждения компилятора постараюсь использовать активнее, но только в рабочих версиях. В релизах они не к чему имхо.

Q:Недопонял, что делают строки вида "#define EPOLLIN EPOLLIN". Можете пояснить?
A: Понятия не имею )))
На сколько я помню, это копипаст отсюда.

Q:Ну и придирки по стилю: избавление от «using namspace std;» и «printf»
A: От printf пожалуй избавлюсь — это наследие от самого первого исходника, который почти целиком из OpenSSL.
Насчет «using namspace std» у меня свое мнение:
я понимаю, что данная строка очень редко кем используется и видимо считается «плохим тоном». Но вот мне лично дурным кажется например такой код
std::shared_ptr<std::map<std::string, std::vector<std::string>>>

там, где вместо этого ужаса можно написать:
using namspace std;
shared_ptr<map<string, vector<string> > >

Не знаю, но по моему, правило «не пишите using namspace» придумали враги c++. Так что не вижу смысла следовать правилам, если они затрудняют жизнь.
Предупреждения компилятора постараюсь использовать активнее, но только в рабочих версиях. В релизах они не к чему имхо.
Wut? o_O
что делают строки вида "#define EPOLLIN EPOLLIN". Можете пояснить?
Скорее всего, когда-то давно enum не было, а константы были объявлены через #define
#define EPOLLIN 0x001

Затем их перенесли в enum, но возможно, где-то остался код, который проверяет, что константы объявлены и переобъявляет их в противном случае (ну или еще как-то полагается на тот факт, что константы объявлены через препроцессор)
#ifndef EPOLLIN
#define EPOLLIN 1
#endif
...
foo(EPOLLIN );
...

Чтобы не ломать такой код, и были добавлены #define, в актуальной версии просто ссылающиеся на enum.
libev (http://libev.schmorp.de/) и libevent (http://libevent.org/) — библиотеки, которые предоставляют event loop (а также много всего вкусного, включая таймауты), абстрагируясь от конкретных особенностей реализации механизмов ожидания событий операционной системы (epoll, kqueue, select). Есть ли хоть одна причина «эмулировать epoll через select»?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории