Комментарии 11
Я оставлю бесконечный цикл в конструкторе по одной причине:
не нужно гордиться незнанием C++. если тебе в классе нужен всего один метод, то подумай нужен ли тебе класс.
всего того же самого но без сайд эффектов можно добиться засунув цикл в статическую функцию класса и вызывать его допустим так
Server::Run()
+7
Я продолжу писать код в заголовочных файлах по ряду причин:…
Те кто уверен, что так как я делать нельзя — можете поучить программированию создателей stl и boost сначала, а потом переименовать файл server.h в server.cpp и будет всем хорошо…
Если весь код можно писать в заголовках, зачем необходимо линковать программы, использующие stl, с libstdc++.so?
+1
>Я не буду использовать 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
+1
Согласен, погорячился. Разница есть, но она видна не в самих функциях copy и memcpy, а при задании их аргументов.
С++
Ассемблер:
Пожалуй не такой уж std::copy тормоз, подумаю еще раз над ее использованием )
С++
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 тормоз, подумаю еще раз над ее использованием )
0
При вызове std::copy не нужно вычитать единицу. Он копирует [first, last), то есть не включая last.
en.cppreference.com/w/cpp/algorithm/copy
en.cppreference.com/w/cpp/algorithm/copy
0
Скажу сразу: весь исходник вашего проекта и статьи целиком не читал, но пробежал глазами.
Меня всегда радуют люди, которые пытаются развиваться. Самоустремлённость — отличное качество человека. Желаю вам не останавливаться.
Радует и то, что вы прислушиваетесь к критике. Проект сразу собрался под Linux указанной вами строкой.
Теперь вопросы.
Спасибо за статьи.
Меня всегда радуют люди, которые пытаются развиваться. Самоустремлённость — отличное качество человека. Желаю вам не останавливаться.
Радует и то, что вы прислушиваетесь к критике. Проект сразу собрался под Linux указанной вами строкой.
Теперь вопросы.
- Планируете ли добавить кросплатформенную систему сборки (к примеру, CMake)? Ведь кросплатформенность одних только исходников ущемляет возможности пользователей ОС, отличных от вашей.
Плюсы:
- Для вас: новый полезный инструмент
- Для других: компиляция одной-двумя привычными командами вместо копирования строки gcc, разрастающейся с ростом проекта
- Для всех: никаких сложностей при развитии проекта
- Планируете ли использовать систему контроля версий? Будет проще отслеживать изменения, делиться исходными кодами и управлять проектом.
- Будете ли включать предупреждения компилятора? Смотрите, сколько дефектов (потенциально — багов) я нашёл в коде, всего лишь добавив при компиляции флаги "-Wall -Werror":
в списке инициализации m_pSSL должно стоять после m_pSSLContext, поскольку оно объявлено ниже в классе. Причина, по которой вам это может быть полезным.server.h:77:8: error: `server::CClient::m_pSSL` will be initialized after
string::find возвращает не -1 в случае отсутствия элемента, а string::npos.server.h:300:45: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare] if (strInputString.find("\r\n\r\n") != -1)
./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 не обязателен.
- Недопонял, что делают строки вида "#define EPOLLIN EPOLLIN". Можете пояснить?
- Ну и придирки по стилю: избавление от «using namspace std;» и «printf» улучшит вашу карму (Человеческую, не хабрахабровую. Хотя, кто знает?) и сделает код более единообразным.
Спасибо за статьи.
+1
Спасибо за подробный и объективный комментарий.
Попробую ответить в меру своих компетенций.
Q: Планируете ли добавить кросплатформенную систему сборки (к примеру, CMake)?
A: В принципе да, но пока нет. Объясню почему:
во-первых, моей основной средой разработки является Visual Studio, по этой причине я очень мало знаю про инструменты разработчиков под Linux и другие платформы. Я несколько раз пытался осилить make, но всякий раз ловил себя на мысли, что не понимаю: «кто и зачем это придумал и кому это нужно».
Ну правда: мне до сих пор всегда в линуксе хватало создать исполняемый файл с именем «compile» и написать в него:
Но, повторюсь, когда я осознаю необходимость 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» у меня свое мнение:
я понимаю, что данная строка очень редко кем используется и видимо считается «плохим тоном». Но вот мне лично дурным кажется например такой код
там, где вместо этого ужаса можно написать:
Не знаю, но по моему, правило «не пишите using namspace» придумали враги c++. Так что не вижу смысла следовать правилам, если они затрудняют жизнь.
Попробую ответить в меру своих компетенций.
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++. Так что не вижу смысла следовать правилам, если они затрудняют жизнь.
-2
что делают строки вида "#define EPOLLIN EPOLLIN". Можете пояснить?Скорее всего, когда-то давно enum не было, а константы были объявлены через #define
#define EPOLLIN 0x001
Затем их перенесли в enum, но возможно, где-то остался код, который проверяет, что константы объявлены и переобъявляет их в противном случае (ну или еще как-то полагается на тот факт, что константы объявлены через препроцессор)
#ifndef EPOLLIN
#define EPOLLIN 1
#endif
...
foo(EPOLLIN );
...
Чтобы не ломать такой код, и были добавлены #define, в актуальной версии просто ссылающиеся на enum.
0
libev (http://libev.schmorp.de/) и libevent (http://libevent.org/) — библиотеки, которые предоставляют event loop (а также много всего вкусного, включая таймауты), абстрагируясь от конкретных особенностей реализации механизмов ожидания событий операционной системы (epoll, kqueue, select). Есть ли хоть одна причина «эмулировать epoll через select»?
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Кроссплатформенный https сервер с неблокирующими сокетами. Часть 3