Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Даже если у вас класс Exception с одним членом reason, нам нужно, по правилам хорошего тона, объявить конструктор, метод Get, метод Get const, можно и Get const volatile, а вдруг пригодится?
А при каких условиях может вообще появиться не константный Get?
не нравится — не ешь
На мой взгляд, это достоинство — код получается недвусмысленный, а это самый важное условие простоты
list_for_each(pos, &mylist.list){
tmp= list_entry(pos, struct kool_list, list);
printf(«to= %d from= %d\n», tmp->to, tmp->from);
}
Применительно к лаконичности языка, Java превосходит С++
GC, в отличии от этого, не трогает «мертвые» объекты вообще
Собирает очень просто — вычисляет граф «живых» объектов, затем перемещает живые объекты так, что-бы они лежали последовательно друг за другом, уплотняя кучу.
В случае умных указателей все равно нужно выполнить код удаления для каждого объекта, даже если используется какая либо хитрая стратегия управления памятью.
речь шла о персистентном дереве, там при каждой вставке элемента в дерево будет происходить копирование log N узлов дерева и удаление log N узлов дерева (если конечно мы не сохраняем все старые версии дерева).
Для толстых объектов есть отдельная куча. По факту это работает быстро, он ведь не делает это для всех объектов сразу
Эти счетчики ведь будут в памяти произвольным образом распределены. Да и декремент нужно делать атомарно, а это неслабые накладные расходы.
Новый элемент не добавляется к корню, там каждый раз создается новое дерево, при этом старое никуда не девается.
::const после метода очень даже не лишний — сразу понятно, есть ли у метода… кхм… «побочные эффекты».Не могу понять откуда взялась страшилка о том, что будущие мейнтейнеры и текущие коллеги по команде — априорно круглые идиоты и поэтому код надо писать как для идиотов.
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?
— Brian Kernigan
Отсутствие деления на декларацию/имплементацию, на мой взгляд, скорее, минус.
File.ReadAllLines("test.txt")
.Where(line => line.Split(' ').Length > 3)
.OrderBy(s => s)
.Run(Console.WriteLine);lines = open('test.txt').readlines()
for line in sorted( filter(lambda x: len(x.split(' ')) > 3, lines) ) :
print line.rstrip('\n')from sys import stdout
lines = open('test.txt').readlines()
stdout.writelines( sorted( filter(lambda x: len(x.split(' ')) > 3, lines) ) )
with open('test.txt') as lines:
stdout.writelines(sorted(_ for _ in lines if len(_.split())>3))with open('test.txt') as lines:
stdout.writelines(sorted(_ for _ in lines if _.count(' ')>2)with open('test.txt') as lineslines = open('test.txt')stdout.writelines(sorted(_ for _ in open('test.txt') if _.count(' ')>2))QFile file("test.txt");
file.open( QIODevice::ReadOnly );
QStringList lines = QString::fromLocal8Bit file.readAll())
.split("\n").filter(QRegExp("(\\S+\\s+){3,}\\S+"));
lines.sort();
foreach (QString line, lines)
qDebug() << line;
Encoding localEncoding = new Encoding(requiredCodePage);
File.ReadAllLines("test.txt")
.Where(line => line.Split(' ').Length > 3)
.OrderBy(s => s)
.Select(s => localEncoding.GetString(Encoding.Unicode.GetBytes(s)))
.Run(Console.WriteLine);
QFile file("test.txt");
file.open(QIODevice::ReadOnly);
QStringList lines =
QTextCodec::codecForName(requiredCodePage)->toUnicode(file.readAll())
.split("\n").filter(QRegExp("(\\S+\\s+){3,}\\S+"));
lines.sort();
foreach (QString line, lines)
qDebug() << line;Foo : () → (int → int) =
() ↦ {
valueToBeClosed : int = 3;
assignNewValue : int → int =
value ↦ {
result : int = valueToBeClosed;
valueToBeClosed = value;
return result;
}
return assignNewValue;
}foo : int → int = Foo(); WiteLine( foo(21) ); // 3 WiteLine( foo(42) ); // 21
[=]) ссылки (указателя shared_ptr). А без этого программа скомпилируется без всяких предупреждений, и, самое страшное, не исключено что при определённых условиях UB будет проявляться так, что создаст видимость правильной работы.Вот это и называется «вещами, над которыми надо корпеть в плюсах и совсем не надо в шарпе».
В момент, когда такая задача возникла
int valueToBeClosed = 3;, то вы не можете просто добавить замыкание, не меняя его контекст. Вы должны не забыть превратить окружение (valueToBeClosed) в ссылку (в общем смысле, не C++) на нестековое значение и передать её по значению.Я прекрасно знаю, как подобный код пишется на C++.
Вы не улавливаете контекста. Я имел в виду, что если у вас уже есть функция с int valueToBeClosed = 3;, то вы не можете просто добавить замыкание, не меняя его контекст.
Подобным состоянием может быть датчик случайных чисел, или какой другой Enumerator
Ерунда. Зачем мне передавать объект с состоянием, если я хочу это состояние скрыть от пользователя?
operator ().Foo : () → (int → int) =
() ↦ {
valueToBeClosed : int = 3;
assignNewValue : int → int =
value ↦ {
result : int = valueToBeClosed;
valueToBeClosed = value;
return result;
}
return assignNewValue;
}static Func<int, int> Foo()
{
int valueToBeClosed = 3;
Func<int, int> assignNewValue = value =>
{
var result = valueToBeClosed;
valueToBeClosed = value;
return result;
};
return assignNewValue;
}std::function<int (int)> Foo()
{
int valueToBeClosed = 3;
auto const assignNewValue = [&] (int value) -> int
{
auto const result = valueToBeClosed;
valueToBeClosed = value;
return result;
};
return assignNewValue;
}std::function<int (int)> Foo()
{
int valueToBeClosed = 3;
auto const assignNewValue = [=](int value) mutable -> int
{
auto const result = valueToBeClosed;
valueToBeClosed = value;
return result;
};
return assignNewValue;
}
superlib::do_some_magic(), где функция берётся из какой-то хитрой никому не известной специализированной библиотеки. А Qt ок, почему нет.#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <set>
#include <string>
using namespace std;
int main()
{
multiset<string> lines;
ifstream fin("in.txt");
string nextLine;
while (getline(fin, nextLine))
if (count(nextLine.begin(), nextLine.end(), ' ') + 1 > 3)
lines.insert(nextLine);
copy(lines.begin(), lines.end(), ostream_iterator<string>(cout, "\n"));
return 0;
}
ООП головного мозга, не относящаяся напрямую к С++
Тот же thread_pool из примера — отличный класс
не хватает структурированности, попробуйте рефакторинг :)

Имеется ввиду, не библиотечный код, а ваш собственный.В общем то шаблоны как раз и предназначены в основном для библиотек — вы пишете обобщенный класс/функцию, который/ая работает не пойми с чем, а пользователи потом заставляют его работать с тем, чем нужно. И да, мой собственный код часто бывает библиотечным, в смысле что приходится писать и куски библиотек иногда.
template struct Loop { Loop<T*> operator->(); };
Loop i, j = i->hooray
struct a{typedef int foo;};struct a1:a{};struct a2:a{};
#define X(b,a) struct a##1:b##1,b##2{};struct a##2:b##1,b##2{};
X(a,b)X(b,c)X(c,d)X(d,e)X(e,f)X(f,g)X(g,h)X(h,i)X(i,j)X(j,k)X(k,l)
X(l,m)X(m,n) n1::foo main(){}
(сам я его снёс - оно питон не понимает)#include using namespace std;
class A
{
public:
virtual void Call() { cout << "A\n"; };
};
class B : public A
{
public:
B() { Call(); }
virtual void Call() { cout << "B\n"; }
};
int main()
{
B b;
return 0;
}
Выводится на экран "B".
Или я что-то не так понял?const рулит, mutable — возможность, а не яма, throw-спецификации теперь deprecated вроде.> А что остается на Эрланге?
Тонна всего. Этот сишный сервер — специализированный акселератор. Берёт очень маленькую часть функциональности, и делает её очень быстро.
> Кстати да, вроде говорил что узкие места на OCaml-е пишете… А тут C вдруг.
Это исключение, потому что очень уж маленький scope. Если бы нужно было внесколькером разрабатывать, или нетривиальности делать — то только OCaml.
я где-то рядом написал: критические по скорости участки кода переписываем на С/С++. Все остальное на любом другом языке.
я где-то рядом написал: критические по скорости участки кода переписываем на С/С++. Все остальное на любом другом языке.
И? Это что-то меняет?
критические по скорости участки кода переписываем на С/С++.
Эти фичи никакого отношения не имеют ни к развитию CUDA ни к самой CUDA.
Боюсь, NVidia пошла на поводу у таких вот радетелей за С++ любой ценой.
Хуже языка для реализации многопоточности и разработки вообще представить себе сложно.
Осталось понять вот это: «Шаблоны на GPU очень помогают сокращать код, избавляя от ветвлений без копипасты»
Что бы вы под этим не подразумевали :-\
Тот же Erlang прекрасно подходит для CUDA.
Динамически типизируемый функциональный язык. Подходит для CUDA. Здесь мне стоит остановиться, ведь я ничего кроме CUDA С++ не знаю, так что да, всего хорошего.
Мощный такой задвигон, как для языка на котором написано куча ОС, офисных пакетов, граф.редакторов, игр и прочей фигни, приносящей по пару сот лимонов производителю каждый год.
попытками написать свой фронт-энд компилер.Вот с этого момент можно подробнее? Ну очень интересно.
А еще пляски с определением, кто должен выделять место под строку, вызывающий функцию или сама функция, а еще ручная проверка длин строк (чтоб буфер не переполнился) и постоянное использование костылей типа strdup() — которые по хорошему, надо бы каленым железом выжигать из недопрограммистов.
enum { Past, Present, Future };, так что всё-таки три формы.stdout.writelines(sorted(_ for _ in open('test.txt') if _.count(' ')>2))IO.foreach('test.txt').select{|s|s.count(' ')>2}.sort.each{|s|print s}и без всяких импортов :).each{|s|print s} могло быть короче, наверное, но как бонус нужные строки возвращает в виде массива, можно ещё что-нибудь сделать )main = readFile "in.txt" >>=
putStrLn . unlines . sort . filter ((3<) . length . words) . lines
puts File.readlines("test.txt").reject {|i| i.count(' ') < 3}.sort
Зачем осиливать все стороны С++? Это универсальный мультипарадигменный язык!
Достала избыточность С++