Pertanyaan Apa sebenarnya yang dimaksud dengan 'penunjuk yang disejajarkan'?


Apakah seseorang tolong beri tahu saya apa itu penunjuk sejajar sebenarnya berarti?


32
2017-12-01 09:34


asal


Jawaban:


Ini berarti bahwa alamat yang ditunjuk secara merata terbagi oleh beberapa faktor.

Kadang-kadang istilah "keselarasan alami" digunakan, yang umumnya berarti bahwa objek yang memiliki keselarasan alami perlu ditempatkan di alamat yang merata oleh ukuran objek.

Penyelarasan terkadang sangat penting, karena banyak hal yang berkaitan dengan perangkat keras menempatkan pembatasan pada penjajaran tersebut.

Misalnya, pada klasik SPARC arsitektur (dan juga klasik LENGAN, Saya pikir), Anda tidak dapat membaca bilangan bulat yang lebih besar dari satu byte dari alamat yang aneh. Mencoba melakukannya akan segera menghentikan program Anda dengan kesalahan bus. Pada arsitektur x86, perangkat keras CPU malah menangani masalah (dengan melakukan banyak akses ke cache dan / atau memori sesuai kebutuhan), meskipun mungkin membutuhkan waktu lebih lama. RISC: arsitektur ier biasanya tidak melakukan ini untuk Anda.

Hal-hal seperti ini juga dapat memengaruhi penyanggaan, yaitu penyisipan data tiruan antara misalnya bidang struktur untuk menjaga keselarasan. Struktur seperti ini:

struct example
{
  char initial;
  double coolness;
};

kemungkinan besar akan berakhir dengan 7 byte padding antara ladang, untuk membuat double bidang sejajarkan pada offset yang dapat dibagi dengan ukurannya sendiri (yang saya anggap 8).

Ketika dilihat dalam biner, alamat disejajarkan dengan n byte akan memiliki log2 nya (n) bit paling tidak signifikan diatur ke nol. Sebagai contoh, sebuah objek yang membutuhkan 32-bit alignment akan memiliki alamat yang benar-benar selaras yang berakhir dengan (biner) 00000, karena log2 (32) adalah 5. Ini juga menyiratkan bahwa sebuah alamat dapat dipaksa menjadi sejajar dengan membersihkan nomor yang diperlukan bit.


34
2017-12-01 09:38



Untuk menambah apa beristirahat menjelaskan, di sini adalah a struct Saya baru saja menggunakan tugas:

struct infosale {               
    int   noseq;                
    char  salesman[30];         
    char  product[11];          
    int   count;                
};                               

Anda mungkin mengharapkan ukuran ini struct menjadi (4 + 30 + 11 + 4 =) 49 byte, tetapi sebenarnya 52 dibandingkan dengan sizeof. Karena noseq aku s 4 byte + salesman aku s 32 byte (selaras) + product aku s 12 byte (selaras) dan count aku s 4 byte, dengan demikian 52 byte.


3
2017-12-01 09:49



Bergantung pada konteksnya, tetapi bisa jadi penunjuk itu sendiri disejajarkan, atau apa yang ditunjuknya diselaraskan.

'Selaras' berarti bahwa objek tertentu disimpan di alamat yang merupakan kelipatan dari konstanta tertentu. Misalnya. untuk bilangan bulat 32-bit ini hampir selalu 4. Ini karena bita adalah 8-bit: 4 * 8 = 32-bit. Seringkali prosesor dapat melakukan akses memori lebih cepat jika objek disimpan pada alamat yang selaras, atau untuk beberapa prosesor itu bahkan tidak mungkin untuk melakukan akses yang tidak selaras.


2
2017-12-01 09:42



Ini adalah penunjuk ke alamat "selaras". Selaras dalam arti bahwa alamat adalah kelipatan dari beberapa nilai - biasanya, ukuran dari jenis apa pun yang akan menunjuk pada (jika tipe primitif), atau dari beberapa anggota data yang membutuhkan keselarasan seperti itu.

Biasanya Anda tidak perlu khawatir tentang hal ini; fungsi alokasi memori akan memastikan bahwa memori yang diberikannya benar. Anda mulai mengkhawatirkan keselarasan pada titik di mana Anda mulai melakukan hal-hal yang tidak aman dengan penunjuk pointer.


1
2017-12-01 09:39



Seperti yang telah disebutkan orang sebelumnya, itu berarti bahwa penunjuk Anda secara merata dapat dibagi oleh sejumlah byte tertentu.

Untuk memeriksa apakah pointer Anda sejajar Anda dapat melakukan ini:

isaligned = !( (long)pointer % bytes );

Sekarang, "isaligned" benar jika "pointer" sejajar dengan byte "byte".


0
2017-12-01 11:28



Aligned Pointer berarti penunjuk dengan lokasi memori yang berdekatan yang dapat diakses dengan menambahkan konstanta dan kelipatannya

untuk char a[5] = "12345"; 

sini a adalah pointer konstan jika Anda dan ukuran char untuk itu setiap kali Anda dapat mengakses chracter berikutnya yaitu,

a+ sizeofchar akan mengakses 2

a+ (sizeofchar * 2) akan mengakses 3 a sebagainya

sama jika Anda mengakses bit variat dengan nilai bit.


0
2017-12-01 13:18