gelen taklit 'kesilebilir' pahalı ve gerekli olmayabilir - sadece NULL
için başlatılmış - ve daha sonra istek üzerine hesaplanır:Cı Böyle bir Cı yapıya sahip olan, C++
const struct expensive_type * my_get_expensive(const struct my_struct * s)
{
if (!s->t)
s->t = my_expensive_alloc(s->i , s->d);
return s->t;
}
C
++ ben struct expensive_type *
üyesinde mutable
kullanılmış olurdu, bu mümkün lokal olarak const uzak döküm yani C benzer bir şey, elde etmektir:
{
struct my_struct * mutable_s = (struct my_struct*) s;
mutable_s->t = ...;
}
Ya imzasında const
kaldırıyor tek standart uyumlu alternatifim? Bir my_struct
ek işaretçi oluşturmalısınız oluşturma
struct expensive; // Forward declaration, ignore
// One could also use a struct expensive * (a pointer) instead
// of this structure. IMO giving it a name is the better option.
struct expensive_handle {
struct expensive * target;
};
// Store the simple data members as usual, store a pointer to a
// handle (pointer) to the expensive ones
struct my_struct {
int simple;
struct expensive_handle * handle;
};
struct expensive {
int content; // whatever
};
/dolaylama için kullanılan tutma sapı:
struct my_struct * new() {
struct my_struct * data = malloc(sizeof(*data));
// Error handling please
// Set simple data members
data->handle = malloc(sizeof(*(data->handle)));
// Error handling please
data->handle->target = NULL;
return data;
}
C. 'de' değişebilir 'veya ona yakın bir şey yoktur. – DyZ
Evet,' const 'öğesini kaldırmalı veya UB'ye zarar vermelidir. Güzel yazı olsa da. İyi bir cevap C spec. – chux
Neden kod, 'my_get_expensive (const struct my_struct * s)' içinde 'const'' ye ihtiyaç duyar? Belki de bu hedef başka bir şekilde karşılanabilir mi? – chux