Std::launder , alignas – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Std::launder  , alignas – C / C++ – Fórum – Programujte.comStd::launder , alignas – C / C++ – Fórum – Programujte.com

 

Stamp
~ Anonymní uživatel
18 příspěvků
10. 3. 2019   #1
-
0
-

Ahoj, z cppreference som trosku upravil kod :
 

#include "pch.h"
#include <memory>
#include <new>
#include <iostream>
#include <iomanip>

struct Tracer {
	int value;
	~Tracer() { std::cout << value << " destructed\n"; }
};

int main()
{

	alignas(Tracer) unsigned char buffer[sizeof(Tracer) * 8];

	for (int i = 0; i < 8; ++i) {
		new(buffer + sizeof(Tracer) * i) Tracer{ i }; //manually construct objects
		std::cout << std::setw(9) << (long long) &buffer + sizeof(Tracer) * i << '\n';
	}
	//auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));
	auto ptr = reinterpret_cast<Tracer*>(buffer);
	std::destroy(ptr, ptr + 8);
}

A zaujima ma, k comu tam potrebujeme:  
->alignas (Tracer) .. viem, ze sa jedna o zarovnanie v pamati, ale tam to asi konci...

-> std::launder , jediny priklad co som k tomu nasiel pokial sme na adrese stareho objektu (ktory mal nejaky const atribut) vytvorili novy a chceli sme ho menit, ale nerozumiem preco ho pouziva aj teraz. 

Dakujem :) 

Nahlásit jako SPAM
IP: 78.99.95.–
KIIV
~ Moderátor
+43
God of flame
10. 3. 2019   #2
-
0
-

To std::launder je pojmenovano podobne jako "money laundering", tj. prani spinavych penez coz je vlastne skryti odkud jsou. Ma to schovat puvod dat, aby kompilator nahodou nevygeneroval optimalizovany kod (hlavne pro konstanty) tam, kde to neni zadouci.

Cele vysvetleni: https://stackoverflow.com/questions/39382501/what-is-the-purpose-of-stdlaunder

Alignas ma asi za ukol zarucit, aby blok pameti zacinal na stejnem miste, jako kdyby to bylo pole danych objektu. Pole bajtu by teoreticky mohlo zacinat posunute a pak by se pristup k objektu rozbil, kdyz by napriklad jeden byte ze 4 byl v jednom 4B slovu a zbytek v dalsim (procesor ma rad zarovnani obvykle na 4B a instrukce procesoru pro praci s celymi slovy s tim take pocitaji).

Nahlásit jako SPAM
IP: 46.135.101.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Stamp
~ Anonymní uživatel
18 příspěvků
10. 3. 2019   #3
-
0
-

A v tomto pripade aky je teda rozdiel medzi tymito dvoma riadkami:
 

auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));
auto ptr = reinterpret_cast<Tracer*>(buffer);

Resp. kedy je vhodne pouzit std::launder? :-)

Nahlásit jako SPAM
IP: 78.99.95.–
gna
~ Anonymní uživatel
1891 příspěvků
11. 3. 2019   #4
-
0
-

Don’t ask. If you’re not one of the 5 or so people in the world who already know what this is, you don’t want or need to know.

Nahlásit jako SPAM
IP: 213.211.51.–
Lopata
~ Anonymní uživatel
1 příspěvek
13. 5. 2019   #5
-
0
-

#3 Stamp
std::launder je vhodné (nutné) použít prakticky vždy, když děláš reinterpret_cast, protože reinterpret_cast rozbije strict aliasing pravidla, což znamená, že při použití reinterpret_cast bez std::launder je kompilátor schopný vygenerovat nefunkční kód. Více zde: https://stackoverflow.com/…ict-aliasing

Nahlásit jako SPAM
IP: 2a02:598:7001:102:60f0:cd9:3419:fd77...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 49 hostů

Podobná vlákna

Namespace std; / using std::***; — založil Nadšenec

Std::streamsize — založil Sony

Std::cout problém — založil Zelenáč

Problém s std::cont — založil Coal_Asasin

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý