Funktionsspezifizierer
Wird in der Deklaration von Funktionen verwendet.
| Dieser Abschnitt ist unvollständig Grund: Auf zwei Seiten aufgeteilt |
inline(seit C99) - Vorschlag an den Compiler, die Funktion "inline" zu setzen, um Aufrufe so schnell wie möglich zu machen._Noreturn(seit C11) - gibt an, dass die Funktion nicht zu der Stelle zurückkehrt, von der sie aufgerufen wurde.
Inhalt |
[editieren] Syntax
| inline function_declaration | |||||||||
| _Noreturn function_declaration | |||||||||
[editieren] Erklärung
[editieren] inline (seit C99)
Das Schlüsselwort inline ist ein Hinweis an den Compiler zur Durchführung einer Optimierung. Der Compiler hat die Freiheit, diese Anforderung zu ignorieren.
Wenn der Compiler die Funktion inline setzt, ersetzt er jeden Aufruf dieser Funktion durch den tatsächlichen Körper (ohne einen Aufruf zu generieren). Dies vermeidet zusätzlichen Aufwand durch den Funktionsaufruf (Platzierung von Daten auf dem Stack und Abrufen des Ergebnisses), kann aber zu einer größeren ausführbaren Datei führen, da der Code der Funktion mehrmals wiederholt werden muss. Das Ergebnis ähnelt funktionsähnlichen Makros.
Der Funktionskörper muss in der aktuellen Übersetzungseinheit sichtbar sein, was das Schlüsselwort inline für die Implementierung von Funktionen innerhalb einer Header-Datei notwendig macht, d.h. ohne eine Quelldatei zu haben, die kompiliert und verknüpft werden muss.
[editieren] inline Beispiel
Mit deaktiviertem Inlining beträgt die Laufzeit etwa 1,70 Sekunden. Mit aktiviertem Inlining liegt die Laufzeit unter einer Sekunde.
/* inline int sum(int a, int b) { return (a + b); } int c = sum(1, 4); // If the compiler inlines the function the compiled code will be the same as writing: int c = 1 + 4; */ #include <stdio.h> #include <stdlib.h> #include <time.h> /* int sum (int a, int b) __attribute__ ((noinline)); */ static inline int sum (int a, int b) { return a+b; } int main(void) { const int SIZE = 100000; int X[SIZE],Y[SIZE],A[SIZE]; int i,j; for (i=0;i<SIZE;++i) { X[i] = rand(); Y[i] = rand(); } clock_t t = clock(); /* start clock */ for (i=0;i<5000;++i) { for (j=0;j<SIZE;++j) A[j] = sum(X[j],Y[j]); } t = clock()-t; /* stop clock */ printf("Time used: %f seconds\n", ((float)t)/CLOCKS_PER_SEC); printf("%d\n", A[0]); return EXIT_SUCCESS; }
Mögliche Ausgabe
Time used: 0.750000 seconds -1643747027
[editieren] _Noreturn (seit C11)
Das Schlüsselwort _Noreturn gibt an, dass die nachfolgende Funktion nicht zu der Funktion zurückkehrt, von der sie aufgerufen wurde. Der Compiler wird in der Regel eine Warnung ausgeben, wenn eine Funktion, die mit _Noreturn deklariert ist, versucht, einen Wert zurückzugeben.
Im folgenden Beispiel wird die Funktion stop_now() aufgerufen, die dazu führt, dass das Programm sofort beendet wird (es sei denn, das SIGABRT-Signal wird abgefangen). Der Code mit dem printf() und dem return EXIT_SUCCESS; nach dem Aufruf von stop_now() wird nie ausgeführt und die Ausführung kehrt nie zur Funktion main() zurück, von wo aus stop_now() aufgerufen wurde.
[editieren] _Noreturn Beispiel
#include <stdlib.h> #include <stdio.h> _Noreturn void stop_now() { abort(); } int main(void) { printf("Preparing to stop...\n"); stop_now(); printf("This code is never executed.\n"); return EXIT_SUCCESS; }
Ausgabe
Preparing to stop... Abort