2009-04-13 12 views

risposta

11

Questo dipende interamente dall'implementazione.

Questo dipende dall'hardware tanto quanto qualsiasi cosa, ma anche dall'età del compilatore. Per chiunque abbia un compilatore ragionevolmente moderno (che significa qualsiasi cosa basato su uno standard dai primi anni 90 o successivi), l'argomento dimensione è un size_t. Questo può essere ragionevolmente il più grande a 16 bit senza segno, il più grande a 32 bit senza segno, o il più grande a 64 bit senza segno, a seconda del modello di memoria compilato dal compilatore. In questo caso, devi solo scoprire di che dimensioni è presente una size_t implementazione. Tuttavia, per molto vecchi compilatori (ovvero, prima di ANSI-C e perhaps for some early versions of ANSI C), tutte le scommesse sono disattivate.

Per quanto riguarda gli standard, ad esempio cygwin e Solaris 7, ad esempio, l'argomento dimensione è un size_t. Guardando un sistema embedded che ho a disposizione, l'argomento dimensione è un unsigned (che significa senza segno a 16 bit). (Il compilatore per questo sistema embedded è stato scritto negli anni 80). Ho trovato un riferimento web ad alcuni ANSI C where the size parameter is an int.

Si consiglia di vedere this article su size_t così come la follow-up article circa un mis-caratteristica di alcune prime versioni di GCC dove size_t stato erroneamente firmati.

In sintesi, per quasi tutti, size_t sarà il riferimento corretto da utilizzare. Per quei pochi che utilizzano sistemi embedded o sistemi legacy con compilatori molto vecchi, tuttavia, è necessario controllare la pagina man.

+0

Chi ha downvoted non deve aver programmato C abbastanza a lungo da trovarsi in giro quando non era così standardizzato. – Eddie

+0

I compilatori pre-C89 sono ancora comuni? Penso che sia abbastanza sicuro dipendere da size_t, ad eccezione del lavoro sui sistemi legacy. –

+0

Ho downvoted perché sembravi dire che questa cosa size_t non è ben standardizzata, il che ovviamente è falso. –

0

Prendono un argomento size_t; quindi dipende dalla piattaforma.

0

Implementazione dipendente, ma è possibile cercare nel file di intestazione (.h) che è necessario includere prima di poter utilizzare memcpy. La dichiarazione ti dirà (cerca size_t o altro).

E poi chiedi che size_t è, beh, questa è la parte dipendente dall'implementazione.

1

Le funzioni normalmente utilizzano un size_t per passare una dimensione come parametro. Dico normalmente perché fgets() utilizza un parametro int, che a mio avviso è un difetto nello standard C.

size_t è definito come un tipo che può contenere la dimensione (in byte) di qualsiasi oggetto a cui si possa accedere. Generalmente è un typedef di unsigned int o unsigned long.
Ecco perché i valori restituiti dall'operatore sizeof sono di tipo size_t.

Quindi 2 ** (sizeof(size_t) * CHAR_BIT) fornisce una quantità massima di memoria che il programma può gestire, ma non è certamente la più precisa.
(CHAR_BIT è definito in limits.h e restituisce il numero di bit contenuti in un char).

+0

Non CHAR_BIT definito per essere 8? O il char è definito solo come 1 byte? –

+0

char = 1 byte, il numero di bit può variare – aib

+0

Per citare lo standard, CHAR_BIT è il "numero di bit per l'oggetto più piccolo che non è un bit-field (byte)", e deve essere almeno 8. Un interessante link: http://c-faq.com/charstring/wchar.html. –

0

A destra, non è possibile copiare aree che sono maggiori di 2^(sizeof (size_t) * 8) byte.Ma non c'è nulla di cui preoccuparsi, perché non è possibile allocare più spazio, perché malloc assume anche la dimensione come parametro size_t.

+0

Penso che tu intenda "2^(sizeof (size_t) * 8)". –

+0

Ben si può chiamare malloc() più volte :) – aib

+0

@aib, certo, ma non saranno garantiti buffer contigui. –

0

C'è anche un problema correlato a ciò che size_t può rappresentare dei versi ciò che la piattaforma consentirà effettivamente a un processo di indirizzare.

Anche con la memoria virtuale su una piattaforma a 64 bit, è improbabile che sia possibile chiamare memcpy() questa settimana con dimensioni superiori a pochi TB circa, e anche in questo caso è una macchina piuttosto calda .... è difficile immaginare come sarebbe una macchina su cui sarebbe possibile installare uno spazio di indirizzamento a 64 bit completamente coperto.

Non importa ai sistemi incorporati con solo pochi KB di memoria scrivibile totale, in cui non ha senso tentare di memcpy() più informazioni della RAM indipendentemente dalla definizione di size_t. Pensa a quello che è appena successo allo stack tenendo l'indirizzo di ritorno da quella chiamata se l'hai fatto?

O sistemi in cui lo spazio di indirizzamento virtuale visto da un processo è inferiore alla memoria fisica installata. Questo è in realtà il caso con un processo Win32 in esecuzione su una piattaforma Win64, ad esempio. (L'ho incontrato per la prima volta con il sistema operativo time sharing TSX-11 in esecuzione su un PDP-11 con 4 MB di memoria fisica e 64 KB di indirizzo virtuale in ogni processo: 4 MB di RAM erano un sacco di memoria, quindi il PC IBM non esiste ancora.)

Problemi correlati