Peruskomennot
Mm. seuraavista komennoista voi olla hyötyä kisatilanteessa:
g++
ls
mkdir
cd
rm
mv
cp
cat
tee
head
tail
less
grep
Muista myös komento, jolla poistetaan rekursiopinon muistirajoitus:
ulimit -s unlimited
Koodin ajaminen komentorivillä
Unix-komentorivillä ohjelmalle voi antaa syötteen kolmella tavalla: käsin, tiedostosta tai "putkittamalla" edellisen komennon tulosteen.
Syöte annetaan tiedostosta seuraavalla tavalla:
./koodi < syote
Ohjelman tuloste puolestaan ohjataan tiedostoon seuraavasti:
./koodi < syote > tulostetiedosto
Syötteen voi antaa myös edellisen komennon tulosteena:
./generoi | ./koodi
Tällöin koodi
-ohjelma saa syötteeksi sen, minkä generoi
tulostaa.
Komentoja ketjuttamalla voi rakentaa hyvinkin monimutkaisia ohjelmia:
./koodi < syote | grep "3$" | head -n 10
Edellinen komento etsii tulosteesta kaikki rivit, jotka loppuvat numeroon kolme ja tulostaa niistä 10 ensimmäistä.
Kääntäminen
C++:n kääntämiseen käytetään tyypillisesti g++
-kääntäjää. Argumenteiksi riittää yksi kooditiedosto:
g++ koodi.cpp
Usein halutaan kuitenkin muutama muukin lippu:
g++ -std=c++17 -Wall -O2 koodi.cpp -o koodi
Nyt tiedosto koodi.cpp
käännetään C++17-standardin mukaisesti, optimoituna, binääriin koodi
. Lisäksi varoitukset on päällä.
Käännösliput
-O2/-O3
Määrittelee optimointitason. -O2 vastaa perusoptimointeja, ja se on usein oletus kisajärjestelmissä. -O3 on korkein optimointitaso, joka saattaa joissain tapauksissa nopeuttaa koodia merkittävästi. O3-optimoinnit saa käyttöön myös kisajärjestelmässä lisäämällä seuraavan rivin ratkaisun alkuun:
#pragma GCC optimize("O3")
-std=c++17
Määrittelee käytettäväksi C++-standardiksi C++ 17 -version, joka sisältää monia hyödyllisiä ominaisuuksia, kuten esimerkiksi std::gcd
ja std::clamp
.
-Wall
Asettaa monia hyödyllisiä varoituksia päälle. Bugi saattaa löytyä miettimällä tarkkaan, mitä varoitus tarkoittaa. Tätä kannattaa käyttää aina.
-fsanitize=address
Tarkistaa kaikki muistinkäytöt, ja lopettaa koodin suorituksen heti, kun muistia käytetään virheellisesti. Tämä on hyödyllinen, koska monet muistivirheet, kuten pienet taulukonylitykset, eivät aiheuta segfaultia suoraan, vaan virhe ilmenee usein vasta myöhemmin arvaamattomalla tavalla.
-g
Sisällyttää debug-tiedot binääriin. Hyödyllinen muun muassa gdb
:tä käyttäessä.
-D_GLIBCXX_DEBUG
Standardikirjaston käsinkirjoitettu debug-toiminnallisuus. Kuten -fsanitize=address
, havaitsee muistivirheitä ja iteraattorien väärinkäyttöä. Se voi myös huomata hienovaraisempia bugeja, kuin pelkkiä muistivirheitä, ja antaa hyödyllisemmän kuvauksen virheestä.