gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Ինչպե՞ս համապատասխանեցնել void *
առանց հայտարարագրված տիպի հղում ունեցող միավորը քեշի տողի չափին համապատասխան ձևով:
Ինձ հետաքրքրում է ստանդարտի հետ հավասարեցման ընդհանուր տեխնիկայի օրինականությունը:
Իմ փորձը
void *ptr = //some valid pointer;
void *aligned_ptr = (void *) ((intptr_t) ptr & -64);
(intptr_t) ptr & -64
մասը համապատասխանում է, քանի որ ցանկացած 7.20.1.4 N2310
:
անստորագիր ամբողջ տիպ, որն ունի այն հատկությունը, որ ցանկացած վավեր ցուցիչ void-ի կարող է փոխարկվել այս տեսակի, այնուհետև նորից ցուցիչի վերածվել void-ի, և արդյունքը կհամեմատվի սկզբնական ցուցիչի հետ:
(intptr_t) ptr & -64
-ին void *
-ի վերածելը հստակ սահմանված վարքագծի համար նախատեսված չէ: 6.3.2.3/5
տրամադրում է որոշ մշուշոտ տեղեկատվություն (օր. իմը).
Ամբողջ թիվը կարող է փոխարկվել ցանկացած ցուցիչի տեսակի: Բացառությամբ նախկինում նշվածի, արդյունքը սահմանված է իրականացման միջոցով, կարող է չլինի ճիշտ հավասարեցված, կարող է չմատնանշել կազմակերպության սուբյեկտին: հիշատակված տեսակ և կարող է լինել ծուղակի ներկայացում:
Եթե ես ճիշտ եմ հասկանում «թակարդի ներկայացում» հասկացությունը, ապա նման դեպքում հնարավոր չէ ունենալ այն, քանի որ օբյեկտի տեսակը հայտարարված չէ։
Ես վստահ չեմ, արդյոք (void *) ((intptr_t) ptr & -64)
-ը ճիշտ է դասավորված Ստանդարտ տեսակետից, թե արդյունքը սահմանված չէ:
UPD՝ 6.2.8
Նկարագրում է
Յուրաքանչյուր վավեր հավասարեցման արժեք պետք է լինի երկուսի ոչ բացասական ինտեգրալ ուժ:
Քանի որ _Alignof (max_align_t)
_______________________________________________________________________________________________________________________________________________________________________________________________________ է, ուրեմն ես ենթադրում եմ, որ 64 բայթ հավասարեցումը պարտադիր չէ, որ ապահովվի gcc-ով: