Verstößt das Casting zwischen T* und einer Gewerkschaft {Zeiger T}* strenge Aliasing -Regeln in C ++?C++

Programme in C++. Entwicklerforum
Anonymous
 Verstößt das Casting zwischen T* und einer Gewerkschaft {Zeiger T}* strenge Aliasing -Regeln in C ++?

Post by Anonymous »

Ich implementiere einen nicht intrusiven Idle-Objektpool in C ++ unter Verwendung einer Vereinigung in einer Struktur. Verstößt dieser Code die strenge Aliasing-Regel? Um dies zu erreichen, verwende ich eine Vereinigung innerhalb einer Knotenstruktur: < /p>

Code: Select all

template
struct IdlePool{
public:
struct Node {   // sizeof (T)  >= 8bytes;
union {
Node* next;
T value;
};
};
public:
Node* head = nullptr;
public:
void push(T* value) {
auto node = (Node*)(value); // ❶
node->next = head;
head = node;
}
T* pop() {
auto ret = head;
if (head) head = head->next;
return (T*)(ret);   // ❷
}
};

struct Data {
int a, b,c=10;
};
int main(){
auto a = new Data;
auto b = new Data;
IdlePool pool;
pool.push(a);
pool.push(b);

auto c = pool.pop();
std::construct_at(c, 1,2,3); // ❸
std::println("{}{}{}", c->a, c->b, c->c);
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post