Forum: PC-Programmierung C++11 std::async und Alignment


von Jgdo (Gast)


Lesenswert?

Hallo zusammen,

ich würde gerne std::async() in Verbindung mit Parametern nutzen, die 
ein Alignment brauchen. Beispiel:
1
#include <future>         // std::async, std::future
2
3
// 16 byte aligned class (VS C++ syntax)
4
__declspec(align(16)) 
5
class C {
6
};
7
8
// dummy
9
bool func(C c)
10
// bool func(const C& c) // funktioniert auch nicht
11
{
12
  return true;
13
}
14
15
int main()
16
{
17
  // call func asynchronously:
18
  std::future<bool> fut = std::async(func, C());
19
20
  fut.get();      // waits for func to return
21
}

Nun gibt mir der Compiler (VS C++ 2015) den Fehler aus:
1
Error C2719 'c': formal parameter with requested alignment of 16 won't be aligned

Dabei ist es egal, ob func() das C direkt oder als const reference 
nimmt. Ich nehme an, dass intern ein Lambda-Ausdruck benutzt wird, um 
den Aufruf "zwischenzuspeichern" und dabei das Alignment verloren geht.

Gibt es da Abhilfe?

BTW: eigentlich nutze ich nicht direkt std::async() sondern eine eigene, 
ähnliche Implementierung, die das Problem ebenfalls hat.

Lieben Gruß

: Verschoben durch User
von Carl D. (jcw2)


Lesenswert?

Jgdo schrieb:
> Nun gibt mir der Compiler (VS C++ 2015) den Fehler aus:
>
1
> Error C2719 'c': formal parameter with requested alignment of 16 won't 
2
> be aligned
3
>
>
> Dabei ist es egal, ob func() das C direkt oder als const reference
> nimmt. Ich nehme an, dass intern ein Lambda-Ausdruck benutzt wird, um
> den Aufruf "zwischenzuspeichern" und dabei das Alignment verloren geht.


Vermutlich (eher sicher) wird ob mit oder ohne Ref, das Objekt c immer 
auf dem Stack erzeugt. Abgesehen von der Tatsache, daß dieser den 
aktuellen Thread gehört, kann man dabei sicher nicht ein beliebiges 
Alignment verlangen, den dieses ist für "Call-Parameter" in der ABI 
festgelegt.
Ich würde mal versuchen das Object c auf dem Heap zu erzeugen (und dann 
als Pointer/Ref an func() zu übergeben), denn Heap-Objekte werden eh 
sehr großzügig "aligned".

von Dr. Sommer (Gast)


Lesenswert?

Was passiert, wenn du das C++ Standard Konstrukt "alignas" verwendest 
statt dem Visual C++ spezifischen declspec ?

http://en.cppreference.com/w/cpp/language/alignas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.