GCC: __attribute__((malloc))

Zitat aus GCC-Dokumentation (Hervorhebung von mir):

Den malloc Attribut wird verwendet, um dem compiler, dass eine Funktion kann
behandelt werden, als wenn jeder nicht-NULL-Zeiger gibt es nicht alle alias
andere Zeiger gültig, wenn die Funktion zurückgibt und, dass der Speicher hat
undefinierter Inhalt
. Dies verbessert Häufig die Optimierung. Standard
Funktionen mit dieser Eigenschaft sind malloc und calloc. realloc-wie
Funktionen haben diese Eigenschaft nicht haben, da der Speicher darauf hingewiesen, nicht
haben undefinierten Inhalt.

Ich habe den folgenden code:

struct buffer {
    size_t alloc;  //Allocated memory in bytes
    size_t size;   //Actual data size in bytes
    char data[];   //Flexible array member
};


#define ARRAY_SIZE <initial_value>

buffer *buffer_new(void) __attribute__((malloc))
{
    struct buffer *ret;

    ret = malloc(sizeof(struct buffer) + ARRAY_SIZE);
    if (!ret)
        fatal(E_OUT_OF_MEMORY);

    ret->alloc = ARRAY_SIZE;
    ret->size = 0;

    return ret;
}

Nun bin ich ein bisschen verwirrt hier: obwohl ich nicht initialisieren, die data Mitglied ich immer noch den alloc und size Felder auf die entsprechenden Werte. Kann ich immer noch überlegen, diesem segment zugeordnet werden von "undefined " Inhalt" und verwenden Sie die malloc Attribut?

  • Ich denke, Sie verkennen die Bedeutung des Attributs. Zum Beispiel calloc gibt den Speicher mit genau definierten Inhalten.
  • da das Attribut explizit fest, der Inhalt ist undefiniert, und da calloc's Speicher ist sehr klar definiert, ich glaube ich muss das Missverständnis etwas zu... könnten Sie das bitte näher erläutern?
  • Ich denke, dass das Attribut für die Unterstützung bei aliasing-Analyse. Der compiler kann davon ausgehen, dass die zurückgegebenen Speicher nicht enthalten, zu sagen, der Zeiger auf ein vorhandenes Objekt.
  • Nähte vernünftig. Ich denke, dass das Handbuch die Formulierung ist unglücklich gewählt.
  • Wahrscheinlich eine gute Frage für einige gcc-Entwickler-Liste (zur Verbesserung des Dokuments)
InformationsquelleAutor peter.slizik | 2013-08-28
Schreibe einen Kommentar