C ++ alignas1不会影响结构的大小

问题描述

考虑以下代码

#include <iostream>

struct alignas(1) H1 {
    uint8_t f8;
    uint64_t f64;
};

#pragma pack(push,1)
struct H3 {
    uint8_t f8;
    uint64_t f64;
};
#pragma pack(pop)

int main() {
    std::cout << "H1 " << sizeof(H1) << std::endl;
    std::cout << "H3 " << sizeof(H3) << std::endl;
    return 0;
}

输出

$ ./a.out
H1 16
H3 9

alignas(1)不会影响H1的大小,而#pragma会影响。 相反,alignas(64)实际上会增加结构的大小。

解决方法

https://godbolt.org/z/bodnG3

declare
    jdoc varchar2 (32767) := 
        '{"items": [{"NAME":"AUDI","YEAR":"2000"},{"NAME":"BMW","YEAR":"2010"}]}';
    jobj json_object_t;
    keys json_key_list;
    jarr json_array_t;
begin
    jobj := json_object_t (jdoc);
    keys := jobj.get_keys;
    jarr := jobj.get_array (keys(1));
    for ai in 0..jarr.get_size ()-1 loop
        jobj := treat (jarr.get(ai) as json_object_t);
        keys := jobj.get_keys;
        for ki in 1..keys.count loop
            dbms_output.put_line (keys(ki)||'='||jobj.get_string (keys(ki)));
        end loop;
    end loop;
end;
/
PL/SQL procedure successfully completed.

NAME=AUDI
YEAR=2000
NAME=BMW
YEAR=2010

您的程序格式错误。不允许使用<source>:3:8: error: requested alignment is less than minimum alignment of 8 for type 'H1' struct alignas(1) H1 { ^ 1 error generated. 削弱对齐要求。