3 votes

Peut-on convertir les tableaux et les structs sans les construire "manuellement" ?

J'ai une structure pour représenter un vecteur dans un espace 3D.

type Vec3 struct {
    X, Y, Z float64
}

Une autre bibliothèque que j'utilise fait quelque chose de similaire, mais différent :

type Vector [3]float64

D'après ce que je comprends, les deux types doivent occuper 24 octets et chaque float64 dans un type doit s'aligner sur un float64 dans l'autre type. Ainsi, nous devrions pouvoir assigner de l'un à l'autre sans trop de problème. Cependant, le compilateur n'aime pas essayer d'effectuer ces castings ni implicitement ni explicitement, donc la méthode la plus propre (mais verbeuse) semble être de toujours construire la valeur manuellement :

// Vec3 to Vector
vec3 := Vec3{1, 2, 3}
vector := Vector{vec3.X, vec3.Y, vec3.Z}

// Vector to Vec3
vector := Vector{1, 2, 3}
vec3 := Vec3{vector[0], vector[1], vector[2]}

Une autre méthode que j'ai trouvée est la suivante, mais elle n'est pas moins verbeuse (et probablement plus lente, et elle ne nous arrêtera pas si jamais l'un des types change).

valueOfTargetType := *(*targetType)(unsafe.Pointer(&sourceValue))

Peut-on donc les utiliser sans construire explicitement une nouvelle valeur ?

3voto

peterSO Points 25725

Pour une solution concise, qui sera inlined, utilisez les méthodes.

Par exemple,

package main

import "fmt"

type Vec3 struct {
    X, Y, Z float64
}

func (v Vec3) Vector() Vector {
    return Vector{v.X, v.Y, v.Z}
}

type Vector [3]float64

func (v Vector) Vec3() Vec3 {
    return Vec3{X: v[0], Y: v[1], Z: v[2]}
}

func main() {
    v3 := Vec3{X: 1, Y: 2, Z: 3}
    v3v := v3.Vector()
    fmt.Println(v3, v3v)

    v := Vector{4, 5, 6}
    vv3 := v.Vec3()
    fmt.Println(v, vv3)
}

Sortie :

{1 2 3} [1 2 3]
[4 5 6] {4 5 6}

2voto

jonathangersam Points 935

convertir entre tableaux et structs sans copier ?

Non.

J'ai l'intention de faire en sorte que l'utilisation de Vec3d au lieu de [3]float64 n'entraîne aucune réduction des performances.

Étant donné qu'il est impossible de convertir des tableaux en structs sans les copier, je vous suggère d'anticiper la copie des éléments suivants type Vec3 -> [3]float64 au début du programme afin de ne pas subir de pénalités pendant la boucle principale.

passer de l'un à l'autre sans copier (ou autres frais généraux lents)

Envisagez d'abord de terminer le programme pour voir si les performances sont acceptables pour les utilisateurs finaux.

D'après mon expérience de travail avec des vecteurs 3d, c'est la application des transformations 3d sur les vecteurs qui est le vrai tueur de performance. Essayez d'exécuter un profileur après coup pour vérifier quelle partie du traitement produirait le meilleur rendement pour votre temps de développement.

J'espère que cela vous aidera. A la vôtre,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X