Initialize a pointer with constinit

181 views Asked by At

I was wondering whether I could initialize a pointer with constinit in C++20, and I didn't find any adequate answer on the internet. I have a simple code like this:

struct a {
    const char *s; // pointer I want to initialize
    int other_random_field; // This is another (useless in this case) field
};

constexpr struct a init(void)
{
    return {"foo", 4};
}
constinit struct a _ = init();

and compiles perfectly. However I don't see any way to make it work with any different type than char *. What if instead of "foo", I wanted to return an array of ints (whose size is known at compile time) or whatever?

So my real question is: Is there any way to call from my init() function a malloc()-like function which gives me the ability to write in a data-segment-allocated buffer?

BTW: The assembly gcc -std=gnu++20 produces is:

    .text
    .globl  _
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "foo"
    .section    .data.rel.local,"aw"
    .align 16
    .type   _, @object
    .size   _, 16
_:
    .quad   .LC0
    .long   4
    .zero   4

which is similar to what I want. But instead of putting .string "foo" I would like to put there, for example, an array of ints.

1

There are 1 answers

0
Goswin von Brederlow On

You can do it with an int array or pointer as long as the address of it is known at compile time.

struct a {
    const int *s; // pointer I want to initialize
    int other_random_field; // This is another (useless in this case) field
};

int x[] = {1, 2};
constexpr struct a init(void)
{
    return {x, 4};
}
constinit struct a _ = init();