SlideShare a Scribd company logo
1 of 64
Effective Code Transformations in C++
Marco Arena

Paolo Polce

marco@italiancpp.org

paolo@webshell.it

Reggio Emilia, 30 Novembre 2013
Italian C++ Community

www.italiancpp.org
@italiancpp

2
Ancora evolvono il C++??!

3
When I hear they’re adding features to C++
This PLT Life - http://this-plt-life.tumblr.com/
4
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
5
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
6
C++ o C#?!

var dati = new List<int>(){1,2,3,4,5};

7
C++ o C#?!

var dati = new List<int>(){1,2,3,4,5};
auto dati = vector<int>{1,2,3,4,5};

8
auto
// C++98
vector<int> vec (10);
vector<int>::iterator it = vec.begin();
auto
// C++98
vector<int> vec (10);
vector<int>::iterator it = vec.begin();
it

10
1

2

3

4
12

6

it

5

7

11

13
10
auto
// C++98
vector<int> vec (10);
vector<int>::iterator it = vec.begin();

// C++11

vector<int> vec (10);
auto it = vec.begin();
auto
// C++98
vector< pair<string, int> > cards = ... ;
vector< pair<string, int> >::iterator it = cards.begin();

12
auto
// C++98
vector< pair<string, int> > cards = ... ;
vector< pair<string, int> >::iterator it = cards.begin();

// C++11

auto it = cards.begin();
13
range-based iteration
// C++98
for (vector<int>::iterator it = vec.begin();
it != vec.end();
++it)
{
cout << *it << " ";
}

14
range-based iteration
// C++11
for (auto i : vec)
{
cout << i << " ";
}

15
range-based iteration
// C++11

for (auto i : vec)
{
cout << i << " ";
}
for (const auto& i : vec)
{
cout << i << " ";
}
16
range-based iteration
C++98

C++11

for ( vector<int>::iterator it =
vec.begin();
it != vec.end();
++it)
{
cout << *it << " ";
}

for (auto i : vec)
{
cout << i << " ";
}

C#
foreach (var i in arrayList)
{
System.Console.Write(i);
}
17
lambdas & algorithms
// C++98
vector<int>::const_iterator find_in_range(const vector<int>& vec)

{
vector<int>::const_iterator i = vec.begin();

for( ; i != vec.end(); ++i )
{
if( *i > 0 && *i < 10 ) break;
}
return i;

}
18
lambdas & algorithms
// C++98
bool elem_in_range(int elem)
{
return elem > 0 && elem < 10;
}
vector<int>::const_iterator it =
find_if (vec.begin(), vec.end(), elem_in_range);

19
lambdas & algorithms
// C++11
auto it = find_if (begin(vec), end(vec),
[](int i) {
return i > 0 && i < 10;
});

20
lambdas & algorithms
// C++14
auto it = find_if (begin(vec), end(vec),
[](auto i) {
return i > 0 && i < 10;
});

21
lambdas & algorithms
C++14

[](auto i) { return i > 0 && i < 10; }

C#
(int i) => i > 0 && i < 10;

22
C++ o C#?!

var dati = new List<int>(){1,2,3,4,5};
auto dati = vector<int>{1,2,3,4,5};

23
initializer lists
// C++98
int arr[] = {1,2,3,4,5};
vector<int> data;
data.push_back(1);
data.push_back(2);
...
vector<int> data (arr, arr + 5);
24
initializer lists
// C++98
int arr[] = {1,2,3,4,5};
vector<int> data (arr, arr + 5);

// C++11
vector<int> data = {1,2,3,4,5};
// oppure (auto-everything syntax):

auto data = vector<int>{1,2,3,4,5};

25
initializer lists
C++98

C++11

vector<int> data;
data.push_back(1);
data.push_back(2);
data.push_back(3);
...

auto data = vector<int>{1,2,3,4,5};

C#

var dati = new List<int>() {1, 2, 3, 4, 5};

26
smart pointers
// C++98
{
Car* car = new Car(...);
...
car->Move();
...
delete car;
}
27
smart pointers
// C++98
{
Car* car = new Car(...);
...
car->Move();
throw exception(…)
...
delete car;
}
28
smart pointers
// C++98

Car *car = NULL;
try
{
car = new Car(...);
car->Move();
delete car;
}
catch(...)
{
delete car;
ASSERT(FALSE);
LOG(ERROR) << "critical";
throw;
}
29
smart pointers
// C++98

catch(...)
{
delete car;
ASSERT(FALSE);
LOG(ERROR) << "critical";

throw;
}

30
smart pointers
{ // C++11
unique_ptr<Car> car {new Car{arg1}};
...
car->Move();
...

} // delete automatico
// C++14
auto car = make_unique<Car>(arg1)
31
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
32
Modern C++: Factory
// C++98
IWriter* Create(...)
{
...
return new CoutWriter(...);
}
// chiamante:
IWriter* writer = Create (...);
...
delete writer;

33
Modern C++: Factory
// C++11
unique_ptr<IWriter> Create (...)
{
...
return unique_ptr<IWriter>(new CoutWriter(...));
}
// chiamante:

auto writer = Create(...);

34
Modern C++: Factory
// C++98
class WriterFactory
{
public:
IWriter* Create(const string& where)
{
if (where == "cout")
return new CoutWriter();
if (where == "dbgview")
return new DbgViewWriter();
if (where == " null")
return new NullWriter();
throw exception("where to write?");
}
};

35
Modern C++: Factory
// C++11-14
class WriterFactory
{
public:
unique_ptr<IWriter> Create(const string& where)
{
static map<string, function<unique_ptr<IWriter>()>> m =
{
{"cout", []{return make_unique<CoutWriter>()}},
{"dbgview", []{return make_unique<DbgViewWriter>()}},
{"null", []{return make_unique<NullWriter>()}}
};
return m.at(where)(); // può sollevare eccezione
// oppure una policy diversa
}
36
};
Modern C++: RAII & DEFER
bool FileExists(const char* path)
{
ifstream file{path}; // file.open()
return file.is_open();
} // file.close() automatico

37
Modern C++: RAII & DEFER
void SomeFuntion()
{
... Anything ...
Log("SomeFunction executed");
}

38
Modern C++: RAII & DEFER
void SomeFuntion()
{
... Anything ...

throw exception(…)

Log("SomeFunction executed");
}

39
Modern C++: RAII & DEFER
// go style
func SomeFuntion()
{
defer func() {
Log("SomeFunction executed")
}
... Anything ...
}

40
Modern C++: RAII & DEFER
void SomeFuntion()
{
defer d{ []{
Log("SomeFunction executed");
}};
... Anything ...
}

41
Modern C++: RAII & DEFER
class defer
{
function<void()> m_toExec;
public:
defer(function<void()> f) : m_toExec{f} { }

~defer()
{
m_toExec();
}
};
Qui una versione migliore e completa: http://www.italiancpp.org/2013/07/16/defer-con-raii-lambda/
42
Modern C++: RAII & DEFER

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

main.cpp: DeferTest

43
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
44
Multi-Threaded C++
int main()
{
vector<int> vec(100000);
iota(begin(vec), end(vec), 0); // 0 1 2 3 4 ...
int avg = 0;
thread t1 { [&]{
avg = accumulate(begin(vec), end(vec), 0)/vec.size();
}};
auto maxEl = max_element(begin(vec), end(vec));
t1.join();

cout << "max: " << *maxEl << endl;
cout << "avg: " << avg << endl;
}
45
Multi-Threaded C++

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

main.cpp: ThreadTest

46
Multi-Threaded C++
int main()
{
vector<int> vec(100000);
iota(begin(vec), end(vec), 0);
auto willbeAvg = async ( [&]{
return accumulate(begin(vec), end(vec), 0)/vec.size();
}};
cout << "max: " << *max_element(begin(vec), end(vec)) << endl;
cout << "avg: " << willbeAvg.get() << endl;
}

47
Multi-Threaded C++

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

main.cpp: FutureTest

48
Multi-Threaded C++

future

promise

get()

v

set_value(v)

Thread 1

Thread 2
49
Multi-Threaded C++

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

main.cpp: PromiseTest

50
Multi-Threaded C++: PPL

void vector_mult(vector<double>& v, double c)
{
for_each( begin(v), end(v),
[&](double& n) {
n *= c;
}
);
}

51
Multi-Threaded C++: PPL
#include <ppl.h>
using namespace Concurrency;
void vector_mult(vector<double>& v, double c)
{
parallel_for_each( begin(v), end(v),
[&](double& n) {
n *= c;
}
);
}

52
Multi-Threaded C++: PPL

Live Demo
git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git

PPLSesame.cpp

53
Outline
• C++11, benvenuto nel team!
– C++98  C++11 & snippet C#

• Il team cambia stile & coding standards
– Design patterns
– Multi-threaded C++

• Alcune linee guida
54
Alcune linee guida
• Devo migrare tutto subito?
– No, intanto assicurati di cosa supporta il tuo
compilatore.
– Inizia migrando le cose deprecate (e.g. auto_ptr).
– Aggiungi qualche test su quello che stai
modificando.
– Vale sempre il principio del boyscout…
55
Alcune linee guida
• Il mio compilatore non supporta alcune
feature del C++11. Che devo fare?
– Se puoi, pianifica una migrazione del compilatore.
– Individua cosa potrà beneficiare del C++11 e come
lo riscriveresti.
– Metti dei reminder per quando migrerai, tipo:
//TO-DO-CPP11: …
56
Alcune linee guida
• Il miglior consiglio per usare C++11/C++14?
– Provalo!
– Il materiale di qualità sul C++ è aumentato.
– Frequenta isocpp.org
– Frequenta italiancpp.org 

57
Marco & Paolo
Marco Arena
marco@italiancpp.org
http://marcoarena.wordpress.com
Paolo Polce
paolo@webshell.it
@paolopolce

webshell.it

agileworks.it
58
~talk() noexcept
{
answer_questions();
}

59
~talk() noexcept
{
answer_questions();
}
Quanto è nerd questa slide?

60
Grazie!

61
Bonus: non-member begin/end
// C++98
vector<int>::iterator it = vec.begin();
int arr[] = {1,2,3,4,5};
arr.begin(); // eh ???
// C++11
auto it = begin(vec);
auto it = begin(arr); // ok!
62
Bonus: make_unique (1)
// C++14
auto car = make_unique<Car>(arg1)
• auto-everything syntax
• Exception-safety:
void func(unique_ptr<Car> c1, unique_ptr<Car> c2);
func(unique_ptr<Car>{new Car{}}, unique_ptr<Car>{new Car{}});

• Le istruzioni per creare i due Car* possono essere riordinate
dal compilatore.
63
Bonus: make_unique (2)
func(unique_ptr<Car>{new Car{}}, unique_ptr<Car>{new Car{}});
Esempio di possibile esecuzione:

1. Allocazione memoria per la prima Car
2. Allocazione memoria per la seconda Car
3. Costruzione prima Car
4. Costruzione seconda Car
5. Costruzione primo unique_ptr
6. Costruzione secondo unique_ptr
Che succede se 4 tira un’eccezione? Memory leak della prima Car!

Se chiamiamo due funzioni (come make_unique), il compilatore è costretto
a fare 1,2,5 insieme e poi 3,4,6! Più dettagli a questo link (Sutter)
64

More Related Content

What's hot

Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clientiScrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clientiMarco Da Rin Zanco
 
Lezione 2: Pianificazione in Extreme Programming
Lezione 2: Pianificazione in Extreme ProgrammingLezione 2: Pianificazione in Extreme Programming
Lezione 2: Pianificazione in Extreme ProgrammingAndrea Della Corte
 
Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Manuel Scapolan
 
Redistributable Intro To Scrum Ita
Redistributable Intro To Scrum ItaRedistributable Intro To Scrum Ita
Redistributable Intro To Scrum ItaLuciano Benetti
 
Lean anche io! No tu no! - Italian Agile Days 2013
Lean anche io! No tu no! - Italian Agile Days 2013Lean anche io! No tu no! - Italian Agile Days 2013
Lean anche io! No tu no! - Italian Agile Days 2013Andrea Scavolini
 
2014 07-08 7° webinar pmi-rome agile scrum
2014 07-08 7° webinar pmi-rome agile scrum2014 07-08 7° webinar pmi-rome agile scrum
2014 07-08 7° webinar pmi-rome agile scrumEmiliano Soldi
 
Sviluppo Agile secondo l'approccio SCRUM
Sviluppo Agile secondo l'approccio SCRUMSviluppo Agile secondo l'approccio SCRUM
Sviluppo Agile secondo l'approccio SCRUMMatteo Papadopoulos
 
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme ProgrammingLe pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme ProgrammingAndrea Francia
 
Agile Project Management
Agile Project ManagementAgile Project Management
Agile Project ManagementGiulio Roggero
 
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del SoftwareUn Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del SoftwareAlessandro Martellone
 
Riccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo it starts_with_a_goal_DevOps_Heroes_ParmaRiccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo it starts_with_a_goal_DevOps_Heroes_ParmaRiccardo Porrini
 
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"Emerasoft, solutions to collaborate
 

What's hot (20)

Dal waterfall allo scrum
Dal waterfall allo scrumDal waterfall allo scrum
Dal waterfall allo scrum
 
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clientiScrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
Scrum! Sopravvivere e gestire progetti tra polli, maiali e clienti
 
Lezione 2: Pianificazione in Extreme Programming
Lezione 2: Pianificazione in Extreme ProgrammingLezione 2: Pianificazione in Extreme Programming
Lezione 2: Pianificazione in Extreme Programming
 
Agile in 45 minuti
Agile in 45 minutiAgile in 45 minuti
Agile in 45 minuti
 
Agile@core - Scrum
Agile@core - ScrumAgile@core - Scrum
Agile@core - Scrum
 
Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!
 
Redistributable Intro To Scrum Ita
Redistributable Intro To Scrum ItaRedistributable Intro To Scrum Ita
Redistributable Intro To Scrum Ita
 
Semplicemente Agile
Semplicemente AgileSemplicemente Agile
Semplicemente Agile
 
Lean anche io! No tu no! - Italian Agile Days 2013
Lean anche io! No tu no! - Italian Agile Days 2013Lean anche io! No tu no! - Italian Agile Days 2013
Lean anche io! No tu no! - Italian Agile Days 2013
 
Pro php refactoring
Pro php refactoringPro php refactoring
Pro php refactoring
 
Agile methodologies
Agile methodologiesAgile methodologies
Agile methodologies
 
2014 07-08 7° webinar pmi-rome agile scrum
2014 07-08 7° webinar pmi-rome agile scrum2014 07-08 7° webinar pmi-rome agile scrum
2014 07-08 7° webinar pmi-rome agile scrum
 
Introduzione a Scrum
Introduzione a ScrumIntroduzione a Scrum
Introduzione a Scrum
 
Sviluppo Agile secondo l'approccio SCRUM
Sviluppo Agile secondo l'approccio SCRUMSviluppo Agile secondo l'approccio SCRUM
Sviluppo Agile secondo l'approccio SCRUM
 
Agile software lifecycle
Agile software lifecycleAgile software lifecycle
Agile software lifecycle
 
Le pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme ProgrammingLe pratiche ingegneristiche di eXtreme Programming
Le pratiche ingegneristiche di eXtreme Programming
 
Agile Project Management
Agile Project ManagementAgile Project Management
Agile Project Management
 
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del SoftwareUn Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
Un Approccio Sistematico Ed Organizzato Allo Sviluppo Del Software
 
Riccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo it starts_with_a_goal_DevOps_Heroes_ParmaRiccardo it starts_with_a_goal_DevOps_Heroes_Parma
Riccardo it starts_with_a_goal_DevOps_Heroes_Parma
 
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
Webinar: "Il database: l’equipaggiamento su cui fare affidamento"
 

Viewers also liked

From Vision To Product
From Vision To ProductFrom Vision To Product
From Vision To ProductStefano Leli
 
Se “Embrace Change” è difficile.
Se “Embrace Change” è difficile.Se “Embrace Change” è difficile.
Se “Embrace Change” è difficile.Fabio Mora
 
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)Gaetano Mazzanti
 
When Tdd Goes Awry (IAD 2013)
When Tdd Goes Awry (IAD 2013)When Tdd Goes Awry (IAD 2013)
When Tdd Goes Awry (IAD 2013)Uberto Barbini
 
Outcome not Output: A Story of Lean UX Adoption
Outcome not Output: A Story of Lean UX AdoptionOutcome not Output: A Story of Lean UX Adoption
Outcome not Output: A Story of Lean UX AdoptionSteve Maraspin
 
Agileday Coderetreat 2013
Agileday Coderetreat 2013Agileday Coderetreat 2013
Agileday Coderetreat 2013Gabriele Lana
 

Viewers also liked (9)

From Vision To Product
From Vision To ProductFrom Vision To Product
From Vision To Product
 
Bravi si diventa
Bravi si diventaBravi si diventa
Bravi si diventa
 
dalTDDalBDD
dalTDDalBDDdalTDDalBDD
dalTDDalBDD
 
TDD anche su iOS
TDD anche su iOSTDD anche su iOS
TDD anche su iOS
 
Se “Embrace Change” è difficile.
Se “Embrace Change” è difficile.Se “Embrace Change” è difficile.
Se “Embrace Change” è difficile.
 
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
One, No One, One Hundred Thousand Projects (Uno, Nessuno, Centomila Progetti)
 
When Tdd Goes Awry (IAD 2013)
When Tdd Goes Awry (IAD 2013)When Tdd Goes Awry (IAD 2013)
When Tdd Goes Awry (IAD 2013)
 
Outcome not Output: A Story of Lean UX Adoption
Outcome not Output: A Story of Lean UX AdoptionOutcome not Output: A Story of Lean UX Adoption
Outcome not Output: A Story of Lean UX Adoption
 
Agileday Coderetreat 2013
Agileday Coderetreat 2013Agileday Coderetreat 2013
Agileday Coderetreat 2013
 

Similar to Effective Code Transformations in C++

Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...Idriss Riouak
 
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Codemotion
 
.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNetMauro Servienti
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventPietro Di Bello
 
AlgoMOOC 05.01. La complessità computazionale
AlgoMOOC 05.01. La complessità computazionaleAlgoMOOC 05.01. La complessità computazionale
AlgoMOOC 05.01. La complessità computazionaleAlessandro Bogliolo
 
How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript Stefano Marchisio
 
PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkTiziano Lattisi
 
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Alberto Pasca
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScriptSinergia Totale
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...Codemotion
 
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...Federico Feroldi
 
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...Codemotion
 

Similar to Effective Code Transformations in C++ (20)

Pycon Jungle
Pycon JunglePycon Jungle
Pycon Jungle
 
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
Presentazione: uno studio sull'efficacia di checker automatici per la moderni...
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
 
.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
 
AlgoMOOC 05.01. La complessità computazionale
AlgoMOOC 05.01. La complessità computazionaleAlgoMOOC 05.01. La complessità computazionale
AlgoMOOC 05.01. La complessità computazionale
 
Pillole di C++
Pillole di C++Pillole di C++
Pillole di C++
 
Hexagonal architecture ita
Hexagonal architecture itaHexagonal architecture ita
Hexagonal architecture ita
 
How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript
 
PyPaPi Qt Java Framework
PyPaPi Qt Java FrameworkPyPaPi Qt Java Framework
PyPaPi Qt Java Framework
 
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
Mobile APPs con Objective-C (iOS 3.1+) - Day 01/02
 
Perl Template Toolkit
Perl Template ToolkitPerl Template Toolkit
Perl Template Toolkit
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScript
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Yagwto
YagwtoYagwto
Yagwto
 
#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)
 
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
Una PA agile, funzionale e serverless: si può fare! by Federico Feroldi and D...
 
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
 
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
Una PA agile, funzionale e serverless: si può fare! - Danilo Spinelli - Codem...
 

Recently uploaded

Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 

Recently uploaded (9)

Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 

Effective Code Transformations in C++

  • 1. Effective Code Transformations in C++ Marco Arena Paolo Polce marco@italiancpp.org paolo@webshell.it Reggio Emilia, 30 Novembre 2013
  • 4. When I hear they’re adding features to C++ This PLT Life - http://this-plt-life.tumblr.com/ 4
  • 5. Outline • C++11, benvenuto nel team! – C++98  C++11 & snippet C# • Il team cambia stile & coding standards – Design patterns – Multi-threaded C++ • Alcune linee guida 5
  • 6. Outline • C++11, benvenuto nel team! – C++98  C++11 & snippet C# • Il team cambia stile & coding standards – Design patterns – Multi-threaded C++ • Alcune linee guida 6
  • 7. C++ o C#?! var dati = new List<int>(){1,2,3,4,5}; 7
  • 8. C++ o C#?! var dati = new List<int>(){1,2,3,4,5}; auto dati = vector<int>{1,2,3,4,5}; 8
  • 9. auto // C++98 vector<int> vec (10); vector<int>::iterator it = vec.begin();
  • 10. auto // C++98 vector<int> vec (10); vector<int>::iterator it = vec.begin(); it 10 1 2 3 4 12 6 it 5 7 11 13 10
  • 11. auto // C++98 vector<int> vec (10); vector<int>::iterator it = vec.begin(); // C++11 vector<int> vec (10); auto it = vec.begin();
  • 12. auto // C++98 vector< pair<string, int> > cards = ... ; vector< pair<string, int> >::iterator it = cards.begin(); 12
  • 13. auto // C++98 vector< pair<string, int> > cards = ... ; vector< pair<string, int> >::iterator it = cards.begin(); // C++11 auto it = cards.begin(); 13
  • 14. range-based iteration // C++98 for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { cout << *it << " "; } 14
  • 15. range-based iteration // C++11 for (auto i : vec) { cout << i << " "; } 15
  • 16. range-based iteration // C++11 for (auto i : vec) { cout << i << " "; } for (const auto& i : vec) { cout << i << " "; } 16
  • 17. range-based iteration C++98 C++11 for ( vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { cout << *it << " "; } for (auto i : vec) { cout << i << " "; } C# foreach (var i in arrayList) { System.Console.Write(i); } 17
  • 18. lambdas & algorithms // C++98 vector<int>::const_iterator find_in_range(const vector<int>& vec) { vector<int>::const_iterator i = vec.begin(); for( ; i != vec.end(); ++i ) { if( *i > 0 && *i < 10 ) break; } return i; } 18
  • 19. lambdas & algorithms // C++98 bool elem_in_range(int elem) { return elem > 0 && elem < 10; } vector<int>::const_iterator it = find_if (vec.begin(), vec.end(), elem_in_range); 19
  • 20. lambdas & algorithms // C++11 auto it = find_if (begin(vec), end(vec), [](int i) { return i > 0 && i < 10; }); 20
  • 21. lambdas & algorithms // C++14 auto it = find_if (begin(vec), end(vec), [](auto i) { return i > 0 && i < 10; }); 21
  • 22. lambdas & algorithms C++14 [](auto i) { return i > 0 && i < 10; } C# (int i) => i > 0 && i < 10; 22
  • 23. C++ o C#?! var dati = new List<int>(){1,2,3,4,5}; auto dati = vector<int>{1,2,3,4,5}; 23
  • 24. initializer lists // C++98 int arr[] = {1,2,3,4,5}; vector<int> data; data.push_back(1); data.push_back(2); ... vector<int> data (arr, arr + 5); 24
  • 25. initializer lists // C++98 int arr[] = {1,2,3,4,5}; vector<int> data (arr, arr + 5); // C++11 vector<int> data = {1,2,3,4,5}; // oppure (auto-everything syntax): auto data = vector<int>{1,2,3,4,5}; 25
  • 26. initializer lists C++98 C++11 vector<int> data; data.push_back(1); data.push_back(2); data.push_back(3); ... auto data = vector<int>{1,2,3,4,5}; C# var dati = new List<int>() {1, 2, 3, 4, 5}; 26
  • 27. smart pointers // C++98 { Car* car = new Car(...); ... car->Move(); ... delete car; } 27
  • 28. smart pointers // C++98 { Car* car = new Car(...); ... car->Move(); throw exception(…) ... delete car; } 28
  • 29. smart pointers // C++98 Car *car = NULL; try { car = new Car(...); car->Move(); delete car; } catch(...) { delete car; ASSERT(FALSE); LOG(ERROR) << "critical"; throw; } 29
  • 30. smart pointers // C++98 catch(...) { delete car; ASSERT(FALSE); LOG(ERROR) << "critical"; throw; } 30
  • 31. smart pointers { // C++11 unique_ptr<Car> car {new Car{arg1}}; ... car->Move(); ... } // delete automatico // C++14 auto car = make_unique<Car>(arg1) 31
  • 32. Outline • C++11, benvenuto nel team! – C++98  C++11 & snippet C# • Il team cambia stile & coding standards – Design patterns – Multi-threaded C++ • Alcune linee guida 32
  • 33. Modern C++: Factory // C++98 IWriter* Create(...) { ... return new CoutWriter(...); } // chiamante: IWriter* writer = Create (...); ... delete writer; 33
  • 34. Modern C++: Factory // C++11 unique_ptr<IWriter> Create (...) { ... return unique_ptr<IWriter>(new CoutWriter(...)); } // chiamante: auto writer = Create(...); 34
  • 35. Modern C++: Factory // C++98 class WriterFactory { public: IWriter* Create(const string& where) { if (where == "cout") return new CoutWriter(); if (where == "dbgview") return new DbgViewWriter(); if (where == " null") return new NullWriter(); throw exception("where to write?"); } }; 35
  • 36. Modern C++: Factory // C++11-14 class WriterFactory { public: unique_ptr<IWriter> Create(const string& where) { static map<string, function<unique_ptr<IWriter>()>> m = { {"cout", []{return make_unique<CoutWriter>()}}, {"dbgview", []{return make_unique<DbgViewWriter>()}}, {"null", []{return make_unique<NullWriter>()}} }; return m.at(where)(); // può sollevare eccezione // oppure una policy diversa } 36 };
  • 37. Modern C++: RAII & DEFER bool FileExists(const char* path) { ifstream file{path}; // file.open() return file.is_open(); } // file.close() automatico 37
  • 38. Modern C++: RAII & DEFER void SomeFuntion() { ... Anything ... Log("SomeFunction executed"); } 38
  • 39. Modern C++: RAII & DEFER void SomeFuntion() { ... Anything ... throw exception(…) Log("SomeFunction executed"); } 39
  • 40. Modern C++: RAII & DEFER // go style func SomeFuntion() { defer func() { Log("SomeFunction executed") } ... Anything ... } 40
  • 41. Modern C++: RAII & DEFER void SomeFuntion() { defer d{ []{ Log("SomeFunction executed"); }}; ... Anything ... } 41
  • 42. Modern C++: RAII & DEFER class defer { function<void()> m_toExec; public: defer(function<void()> f) : m_toExec{f} { } ~defer() { m_toExec(); } }; Qui una versione migliore e completa: http://www.italiancpp.org/2013/07/16/defer-con-raii-lambda/ 42
  • 43. Modern C++: RAII & DEFER Live Demo git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git main.cpp: DeferTest 43
  • 44. Outline • C++11, benvenuto nel team! – C++98  C++11 & snippet C# • Il team cambia stile & coding standards – Design patterns – Multi-threaded C++ • Alcune linee guida 44
  • 45. Multi-Threaded C++ int main() { vector<int> vec(100000); iota(begin(vec), end(vec), 0); // 0 1 2 3 4 ... int avg = 0; thread t1 { [&]{ avg = accumulate(begin(vec), end(vec), 0)/vec.size(); }}; auto maxEl = max_element(begin(vec), end(vec)); t1.join(); cout << "max: " << *maxEl << endl; cout << "avg: " << avg << endl; } 45
  • 46. Multi-Threaded C++ Live Demo git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git main.cpp: ThreadTest 46
  • 47. Multi-Threaded C++ int main() { vector<int> vec(100000); iota(begin(vec), end(vec), 0); auto willbeAvg = async ( [&]{ return accumulate(begin(vec), end(vec), 0)/vec.size(); }}; cout << "max: " << *max_element(begin(vec), end(vec)) << endl; cout << "avg: " << willbeAvg.get() << endl; } 47
  • 48. Multi-Threaded C++ Live Demo git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git main.cpp: FutureTest 48
  • 50. Multi-Threaded C++ Live Demo git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git main.cpp: PromiseTest 50
  • 51. Multi-Threaded C++: PPL void vector_mult(vector<double>& v, double c) { for_each( begin(v), end(v), [&](double& n) { n *= c; } ); } 51
  • 52. Multi-Threaded C++: PPL #include <ppl.h> using namespace Concurrency; void vector_mult(vector<double>& v, double c) { parallel_for_each( begin(v), end(v), [&](double& n) { n *= c; } ); } 52
  • 53. Multi-Threaded C++: PPL Live Demo git clone https://ilpropheta@bitbucket.org/ilpropheta/iad2013.git PPLSesame.cpp 53
  • 54. Outline • C++11, benvenuto nel team! – C++98  C++11 & snippet C# • Il team cambia stile & coding standards – Design patterns – Multi-threaded C++ • Alcune linee guida 54
  • 55. Alcune linee guida • Devo migrare tutto subito? – No, intanto assicurati di cosa supporta il tuo compilatore. – Inizia migrando le cose deprecate (e.g. auto_ptr). – Aggiungi qualche test su quello che stai modificando. – Vale sempre il principio del boyscout… 55
  • 56. Alcune linee guida • Il mio compilatore non supporta alcune feature del C++11. Che devo fare? – Se puoi, pianifica una migrazione del compilatore. – Individua cosa potrà beneficiare del C++11 e come lo riscriveresti. – Metti dei reminder per quando migrerai, tipo: //TO-DO-CPP11: … 56
  • 57. Alcune linee guida • Il miglior consiglio per usare C++11/C++14? – Provalo! – Il materiale di qualità sul C++ è aumentato. – Frequenta isocpp.org – Frequenta italiancpp.org  57
  • 58. Marco & Paolo Marco Arena marco@italiancpp.org http://marcoarena.wordpress.com Paolo Polce paolo@webshell.it @paolopolce webshell.it agileworks.it 58
  • 62. Bonus: non-member begin/end // C++98 vector<int>::iterator it = vec.begin(); int arr[] = {1,2,3,4,5}; arr.begin(); // eh ??? // C++11 auto it = begin(vec); auto it = begin(arr); // ok! 62
  • 63. Bonus: make_unique (1) // C++14 auto car = make_unique<Car>(arg1) • auto-everything syntax • Exception-safety: void func(unique_ptr<Car> c1, unique_ptr<Car> c2); func(unique_ptr<Car>{new Car{}}, unique_ptr<Car>{new Car{}}); • Le istruzioni per creare i due Car* possono essere riordinate dal compilatore. 63
  • 64. Bonus: make_unique (2) func(unique_ptr<Car>{new Car{}}, unique_ptr<Car>{new Car{}}); Esempio di possibile esecuzione: 1. Allocazione memoria per la prima Car 2. Allocazione memoria per la seconda Car 3. Costruzione prima Car 4. Costruzione seconda Car 5. Costruzione primo unique_ptr 6. Costruzione secondo unique_ptr Che succede se 4 tira un’eccezione? Memory leak della prima Car! Se chiamiamo due funzioni (come make_unique), il compilatore è costretto a fare 1,2,5 insieme e poi 3,4,6! Più dettagli a questo link (Sutter) 64