Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 16:31

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



alignas keyword usage

Discussion on alignas keyword usage within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Hiris's Avatar
 
elite*gold: 99
Join Date: Apr 2011
Posts: 730
Received Thanks: 236
alignas keyword usage

Hoi, ich bin letztens über alignas gestolpert und hab das Beispiel dafür nicht direkt verstanden darum gleich mal etwas recherchiert und durch

auch eigentlich so halbwegs verstanden was da passiert ( 16 byte grenze bei #
struct alignas(16) sse_t
{
float sse_data[4];
};

zum Beispiel, also dürfte der Inhalt des Structs nicht mehr als 16 bytes veranschlagen? So hab ichs zumindest verstanden.)

Meine Frage wäre jetzt vor allem, wann es sinnvoll ist sowas einzusetzen, evtl. ein kleines Beispiel
Hiris is offline  
Old 10/20/2014, 16:38   #2

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
Quote:
zum Beispiel, also dürfte der Inhalt des Structs nicht mehr als 16 bytes veranschlagen? So hab ichs zumindest verstanden.)
Falsch.

CPUs können Daten verschieden Effizient adressieren. Ein Index 8 oder 16 kann schneller geladen werden als ein Index 3 oder 11, weshalb mit der alignas() Instruktion ein Padding geschaffen wird.
Hat man jetzt z.B. in deinem Beispiel noch einen int i (size=4), einen char c (size=1) und einen short s (size=2), so wird i direkt nach sse_data sein, c wird nach einem Padding von 12 Byte folgen und s nach einem Padding von 15 Byte. Ein weiterer Member hätte einen Abstand von 14 Byte zu s.

Beim Reverse Engineering ist das relativ relevant, da die struct-Member bei nachgebauten structs exakt an der selben Stelle im Speicher liegen sollen.

Code:
struct alignas(16) sse_t
{
    float sse_data[4];
    int i;
    char c;
    short s;
};
würde nachgebaut so aussehen:

Code:
struct alignas(1) sse_t
{
    float sse_data[4]; // 16 byte
    int i; // 4 byte
    char padding_1[12]; // 12 byte padding
    char c; // 1 byte
    char padding_2[15]; // 15 byte padding
    short s; // 2 byte
// nicht sicher, ob das ebenfalls implementiert wird:
    char padding_3[14]; // 14 byte padding
};
sizeof(sse_t) wäre dann 60, obwohl nur 23 byte für die Member belegt werden.
snow is offline  
Old 10/20/2014, 16:46   #3
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by snow View Post
Falsch.

CPUs können Daten verschieden Effizient adressieren. Ein Index 8 oder 16 kann schneller geladen werden als ein Index 3 oder 11, weshalb mit der alignas() Instruktion ein Padding geschaffen wird.
Hat man jetzt z.B. in deinem Beispiel noch einen int i (size=4), einen char c (size=1) und einen short s (size=2), so wird i direkt nach sse_data sein, c wird nach einem Padding von 12 Byte folgen und s nach einem Padding von 15 Byte. Ein weiterer Member hätte einen Abstand von 14 Byte zu s.

Beim Reverse Engineering ist das relativ relevant, da die struct-Member bei nachgebauten structs exakt an der selben Stelle im Speicher liegen sollen.

Code:
struct alignas(16) sse_t
{
    float sse_data[4];
    int i;
    char c;
    short s;
};
würde nachgebaut so aussehen:

Code:
struct alignas(1) sse_t
{
    float sse_data[4]; // 16 byte
    int i; // 4 byte
    char padding_1[12]; // 12 byte padding
    char c; // 1 byte
    char padding_2[15]; // 15 byte padding
    short s; // 2 byte
// nicht sicher, ob das ebenfalls implementiert wird:
    char padding_3[14]; // 14 byte padding
};
sizeof(sse_t) wäre dann 60, obwohl nur 23 byte für die Member belegt werden.
was verbrichst du denn da für nen schwachsinn?
die objektinstanzen der strukt werden auf 16byte boundaries aligned, die einzelnen member werden nicht aligned.
Dr. Coxxy is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
CPU Usage
03/06/2013 - Conquer Online 2 - 0 Replies
Can someone do some coding and get rid of this problem? Or tell me how I can do it? I formated and reinstalled windows 7.. CO leaked before but was manageable. Now it runs at 98 pct CPU, drains my physical memory down to 42 free and all this is making my poor cpu run at 92 degrees C. Ive been on all types of forums, shut down essentially everything running in windows and even tried the dumb process explorer "Kill the extra conquer.exes" which only served to disconnect me constantly. PLEASE...
missing seperator character after keyword..??
04/11/2012 - AutoIt - 13 Replies
ich hab mir ein tool für autoit gescriptet... doch es kommt immer ein fehler meldung ich möche nicht das es geklaut wird deswegen schrieb ich nur den teil der Fehlermedlung heraus Case $hotkeyset Send ("{HotKeySet ( "key" )}")
Keyword
01/29/2012 - Mabinogi - 9 Replies
Is it posible to send a pack of x keyword with a character that dosen't have it? thx for any help. :)
CPU usage 80% when i am looking at SRO
01/13/2011 - Silkroad Online - 31 Replies
What i mean is when i alt tab to SRO , i get 80% cpu usage, if i alt tab out to other window (no longer looking at sro) i get 5% cpu usage... I got a Core2Duo 2.66ghz, should be able to run this shit fine (only 1 client)



All times are GMT +1. The time now is 16:31.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.