Faits :
A.
Par jugement du 4 décembre 2018, le Tribunal correctionnel de la République et canton de Genève a condamné A._, pour infractions à la LStup (art. 19 al. 1 let. c LStup et art. 19 al. 1 let. b, c et d cum al. 2 let. b et c LStup), à une peine privative de liberté de cinq ans. Il a en outre ordonné son expulsion du territoire suisse pour une durée de cinq ans.
B.
Par arrêt du 2 juillet 2019, la Chambre pénale d'appel et de révision de la Cour de justice genevoise a partiellement admis l'appel formé par A._ contre ce jugement et a réformé celui-ci en ce sens que le prénommé est condamné à une peine privative de liberté de quatre ans et demi. Elle a confirmé le jugement pour le surplus.
La cour cantonale a retenu les faits suivants.
B.a. A._ est né en 1984 en France, pays dont il est ressortissant. Ses parents, de même que ses frères et soeur, y résident toujours. Le prénommé a commencé à travailler à B._, il y a une dizaine d'années, au bénéfice d'un permis pour frontaliers. Grâce à son mariage avec une Suissesse, il a obtenu un permis de séjour valable du 1er juillet 2014 au 30 juin 2019. Le couple a eu deux enfants, désormais âgés de 2 et 4 ans. A._ s'est trouvé au chômage depuis 2016.
Le casier judiciaire suisse de A._ fait état de deux condamnations, en 2012 puis 2014, pour des infractions aux règles de la circulation routière.
B.b. Le 19 octobre 2015, A._ a pris part à un trafic de stupéfiants portant sur 2 kg de haschich pour un prix de 3'200 fr. le kg. Il s'est procuré cette drogue auprès d'un fournisseur puis l'a remise à un comparse.
B.c. Depuis décembre 2016, A._ a pris part à un important trafic international de résine de cannabis entre la France et la Suisse. Il a agi en qualité de coordinateur du trafic pour la région genevoise et s'est, à plusieurs reprises, procuré de la drogue en France. Il s'est chargé du transport des stupéfiants depuis la France vers la région genevoise en s'adjoignant les services de divers acolytes. Le prénommé a en outre livré ou fait livrer des stupéfiants à différents clients, en vue de la vente de cette marchandise sur le marché genevois, et a organisé la distribution et la vente de la drogue à B._, parfois en procédant lui-même aux remises de marchandise.
A._ a ainsi réalisé un chiffre d'affaires total de plus de 100'000 fr., correspondant à 33,5 kg de stupéfiants. En outre, 474 kg supplémentaires ont pu être saisis, ce qui représentait un chiffre d'affaires potentiel de plus d'un million de francs.
C.
A._ forme un recours en matière pénale au Tribunal fédéral contre l'arrêt du 2 juillet 2019, en concluant principalement à sa réforme en ce sens que son expulsion du territoire suisse n'est pas ordonnée et, subsidiairement, à son annulation et au renvoi de la cause à l'autorité précédente pour nouvelle décision. Il sollicite par ailleurs le bénéfice de l'assistance judiciaire.
Considérant en droit :
1.
Le recourant reproche à la cour cantonale d'avoir ordonné son expulsion du territoire suisse.
1.1. Aux termes de l'art. 66a al. 1 let. o CP, le juge expulse de Suisse l'étranger qui est notamment condamné pour infraction à l'art. 19 al. 2 LStup, quelle que soit la quotité de la peine prononcée à son encontre, pour une durée de cinq à quinze ans. Selon l'art. 66a al. 2 CP, le juge peut exceptionnellement renoncer à une expulsion lorsque celle-ci mettrait l'étranger dans une situation personnelle grave et que les intérêts publics à l'expulsion ne l'emportent pas sur l'intérêt privé de l'étranger à demeurer en Suisse. A cet égard, il tiendra compte de la situation particulière de l'étranger qui est né ou qui a grandi en Suisse.
En l'espèce, le recourant a été reconnu coupable d'infraction grave à la LStup, qui tombe sous le coup de l'art. 66a al. 1 let. o CP. Il remplit donc a priori les conditions d'une expulsion, sous la réserve d'une application de l'art. 66a al. 2 CP, voire également des normes de droit international.
1.2. Les conditions pour appliquer l'art. 66a al. 2 CP sont cumulatives. Afin de pouvoir renoncer à une expulsion prévue par l'art. 66a al. 1 CP, il faut, d'une part, que cette mesure mette l'étranger dans une situation personnelle grave et, d'autre part, que les intérêts publics à l'expulsion ne l'emportent pas sur l'intérêt privé de l'étranger à demeurer en Suisse. Le juge doit faire usage du pouvoir d'appréciation qui lui est conféré par une norme potestative dans le respect des principes constitutionnels. S'il devait refuser de renoncer à l'expulsion alors que les conditions de la clause de rigueur sont remplies, le principe de proportionnalité ancré à l'art. 5 al. 2 Cst. serait violé. Le juge doit ainsi renoncer à l'expulsion lorsque les conditions de l'art. 66a al. 2 CP sont réunies, conformément au principe de proportionnalité (ATF 144 IV 332 consid. 3.3 p. 339 s.).
1.3.
1.3.1. La loi ne définit pas ce qu'il faut entendre par une "situation personnelle grave" (première condition cumulative) ni n'indique les critères à prendre en compte dans la pesée des intérêts (seconde condition cumulative).
En recourant à la notion de cas de rigueur dans le cadre de l'art. 66a al. 2 CP, le législateur a fait usage d'un concept ancré depuis longtemps dans le droit des étrangers. Compte tenu également du lien étroit entre l'expulsion pénale et les mesures du droit des étrangers, il est justifié de s'inspirer, de manière générale, des critères prévus par l'art. 31 al. 1 de l'ordonnance relative à l'admission, au séjour et à l'exercice d'une activité lucrative (OASA; RS 142.201) et de la jurisprudence y relative, dans le cadre de l'application de l'art. 66a al. 2 CP. L'art. 31 al. 1 OASA prévoit qu'une autorisation de séjour peut être octroyée dans les cas individuels d'extrême gravité. Elle commande de tenir compte notamment de l'intégration du requérant selon les critères d'intégration définis à l'art. 58a al. 1 de la loi fédérale sur les étrangers et l'intégration (LEI; RS 142.20), de la situation familiale, particulièrement de la période de scolarisation et de la durée de la scolarité des enfants, de la situation financière, de la durée de la présence en Suisse, de l'état de santé ainsi que des possibilités de réintégration dans l'Etat de provenance. Comme la liste de l'art. 31 al. 1 OASA n'est pas exhaustive et que l'expulsion relève du droit pénal, le juge devra également, dans l'examen du cas de rigueur, tenir compte des perspectives de réinsertion sociale du condamné (ATF 144 IV 332 consid. 3.3.2 p. 340 s.; arrêt 6B_661/2019 du 12 septembre 2019 consid. 3.3.1). En règle générale, il convient d'admettre l'existence d'un cas de rigueur au sens de l'art. 66a al. 2 CP lorsque l'expulsion constituerait, pour l'intéressé, une ingérence d'une certaine importance dans son droit au respect de sa vie privée et familiale garanti par la Constitution fédérale (art. 13 Cst.) et par le droit international, en particulier l'art. 8 CEDH (arrêts 6B_2/2019 du 27 septembre 2019 consid. 7.1; 6B_131/2019 du 27 septembre 2019 consid. 2.4; 6B_661/2019 précité consid. 3.3.1).
1.3.2. En l'espèce, la cour cantonale a considéré que l'expulsion du recourant constituerait une ingérence dans sa vie privée et familiale, puisque ce dernier serait contraint de quitter un pays dans lequel il était socialement intégré et où vivaient son épouse et ses deux enfants de nationalité suisse. Elle a cependant estimé que, compte tenu de la possibilité pour le recourant de s'établir près de la frontière franco-suisse, soit à quelques kilomètres de B._ s'il le souhaitait, l'intéressé pourrait maintenir des contacts réguliers avec sa famille et conserver son cercle social. Elle a ajouté que la famille du recourant pourrait même s'établir en France, que l'épouse de celui-ci pourrait conserver son emploi à B._ et que les enfants du couple, encore jeunes, pourraient soit demeurer dans leur école, soit être scolarisés en France sans subir des désagréments particuliers. L'autorité précédente en a conclu que la première condition cumulative pour une application de l'art. 66a al. 2 CP, soit l'existence d'une situation personnelle grave, n'était pas remplie.
Le recourant conteste cette appréciation. En l'occurrence, la question peut être laissée ouverte, car, à supposer qu'une expulsion puisse placer le recourant dans une situation personnelle grave - en particulier au regard de son droit au respect de sa vie privée et familiale au sens de l'art. 8 par. 1 CEDH -, cette mesure pourrait de toute manière être confirmée au regard de l'art. 8 par. 2 CEDH (cf. consid. 1.4.2 infra).
1.4. Il convient de déterminer si l'intérêt privé du recourant à demeurer en Suisse pourrait l'emporter sur les intérêts publics présidant à son expulsion. Cet examen implique en particulier de déterminer si la mesure litigieuse respecte le principe de la proportionnalité découlant des art. 5 al. 2 Cst. et 8 par. 2 CEDH (cf. arrêt 6B_2/2019 précité consid. 8 et les références citées).
1.4.1. S'agissant de la situation du recourant, la cour cantonale a exposé que celui-ci avait en Suisse de nombreux amis et était intégré dans ce pays où il avait exercé diverses activités, notamment sportives. Cependant, le recourant n'avait résidé en Suisse qu'entre septembre 2014 et mars 2017, moment auquel il avait été arrêté. Il avait, dès octobre 2015, commis une première infraction à la législation sur les stupéfiants et se trouvait au chômage depuis septembre 2016. Par ailleurs, rien ne permettait de retenir que la place de chauffeur-livreur apparemment promise à l'intéressé serait encore disponible à sa sortie de prison, cela d'autant que son permis de séjour était désormais échu. Selon l'autorité précédente, rien n'indiquait que les possibilités de réintégration du recourant en France seraient plus mauvaises qu'en Suisse.
1.4.2. En l'espèce, les intérêts présidant à l'expulsion du recourant sont importants, dès lors que celui-ci s'est livré, par métier, à un important trafic de stupéfiants en direction de la Suisse. Il y a lieu de relever à cet égard que la Cour européenne des droits de l'Homme estime que, compte tenu des ravages de la drogue dans la population, les autorités sont fondées à faire preuve d'une grande fermeté à l'encontre de ceux qui contribuent à la propagation de ce fléau (cf. arrêts CourEDH K. M. c. Suisse du 2 juin 2015 [requête n° 6009/10] § 55; Dalia c. France du 19 février 1998, Recueil CourEDH 1998-I 76 § 54; cf. aussi arrêts 6B_131/2019 précité consid. 2.6; 6B_661/2019 précité consid. 3.6 et les références citées). Par ailleurs, la peine privative de liberté à laquelle a été condamné le recourant dépasse largement une année, ce qui aurait, cas échéant, pu permettre une révocation de son autorisation de séjour sur la base de l'art. 62 al. 1 let. b LEI (cf. ATF 139 I 145 consid. 2.1 p. 147, selon lequel constitue une "peine privative de liberté de longue durée" au sens de l'art. 62 al. 1 let. b LEtr [depuis le 1er janvier 2019 : LEI] toute peine dépassant un an d'emprisonnement).
Concernant l'intérêt du recourant à pouvoir demeurer en Suisse, il convient de relever que celui-ci n'y est établi que depuis quelques années et qu'il se trouve en détention depuis 2017. Depuis 2016, il se trouvait au chômage, de sorte que son intégration professionnelle n'apparaît pas particulièrement réussie. On ne voit pas, désormais, que sa réintégration professionnelle puisse se faire plus aisément en Suisse qu'en France, même si le recourant se prévaut d'une promesse d'emploi dans notre pays, où il ne dispose plus d'un permis de séjour. Le recourant reproche à la cour cantonale d'avoir, s'agissant de son intégration en Suisse, établi les faits de manière arbitraire (cf. art. 97 al. 1 LTF). Il évoque à ce propos - d'une manière appellatoire et donc irrecevable (cf. à cet égard ATF 145 IV 154 consid. 1.1 p. 156) - les différents emplois occupés dans ce pays ainsi que la formation qu'il y avait entamée, la constitution d'un cercle d'amis ainsi que l'exercice de ses loisirs. Il apparaît de toute manière que ces éléments ressortent expressément de l'arrêt attaqué, de sorte qu'on ne voit pas en quoi l'autorité précédente aurait pu verser dans l'arbitraire sur ce point.
Par ailleurs, plusieurs membres de la famille du recourant vivent en France, notamment à C._, ce qui est de nature à faciliter la réintégration de l'intéressé dans ce pays et, en particulier s'il le souhaite, à proximité de B._. L'atteinte à la vie familiale du recourant demeurerait quant à elle limitée - à supposer encore que son épouse et ses enfants ne viennent pas s'installer en France, ce qui n'apparaît aucunement exclu -, puisque l'intéressé pourrait entretenir, depuis ce pays, des contacts réguliers avec sa famille.
Pour le reste, le recourant tente de minimiser l'importance des infractions commises - en insistant sur le fait qu'il ne s'est pas livré au trafic portant sur une "drogue dure" - et rappelle qu'il n'avait jamais été, par le passé, condamné pour des infractions à la législation sur les stupéfiants. Il se réfère en outre à un arrêt du Tribunal fédéral (6B_1079/2018 du 14 décembre 2018) et compare sa propre situation avec celle de la personne dont l'expulsion avait été confirmée dans cette affaire. Aucun de ces arguments ne permet de considérer que la pesée des intérêts en présence commanderait de renoncer à l'expulsion de l'intéressé. En effet, compte tenu de la gravité des infractions commises dans le domaine des stupéfiants, de la faible durée du séjour du recourant en Suisse, de son intégration professionnelle médiocre et des possibilités qui s'offriraient à lui - depuis la France - pour maintenir des contacts réguliers avec sa famille et son cercle amical, l'intérêt public à l'expulsion l'emporte nettement sur l'intérêt privé de l'intéressé à demeurer dans ce pays. L'expulsion, ordonnée pour une durée de cinq ans, s'avère conforme au principe de la proportionnalité découlant des art. 5 al. 2 Cst. et 8 par. 2 CEDH.
1.5. La seconde condition pour l'application de l'art. 66a al. 2 CP n'étant pas réalisée, la cour cantonale n'a pas violé le droit fédéral, constitutionnel ou international en ordonnant l'expulsion du recourant pour une durée de cinq ans.
2.
Le recours doit être rejeté dans la mesure où il est recevable. Comme il était dénué de chances de succès, la demande d'assistance judiciaire doit être rejetée (art. 64 al. 1 LTF). Le recourant, qui succombe, supportera les frais judiciaires (art. 66 al. 1 LTF), dont le montant sera fixé en tenant compte de sa situation financière, laquelle n'apparaît pas favorable.
Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté dans la mesure où il est recevable.
2.
La demande d'assistance judiciaire est rejetée.
3.
Les frais judiciaires, arrêtés à 1'200 fr., sont mis à la charge du recourant.
4.
Le présent arrêt est communiqué aux parties et à la Cour de justice de la République et canton de Genève, Chambre pénale d'appel et de révision.
Lausanne, le 18 octobre 2019
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
Le Greffier : Graa