C++11 std::async und Alignment

Gast #4577198
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ß
#4577304
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".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren